あなたはあなたのコード内での単純な誤り製:
str.replace( "i" は、 "A")を、
str.replace
戻り行わ置換した新しい文字列が、それは実際には、既存の変数を置き換えるものではありません。変更を確認するにはstr = str.replace("i", "a");
を試してください。
しかし、あなたはまた、割り当てについてあまりにも広く一般的な声明製:
メモリの割り当てと文字列処理上だから、すべての操作を。
これは間違いです。多くの操作で新しいメモリを割り当てる必要はありません。既存の文字列をスライスできるものは必要と新しいメモリを避け、そうします:
import std.string;
import std.stdio;
void main() {
string a = " foo ";
string b = a.strip();
assert(b == "foo"); // whitespace stripped off...
writeln(a.ptr);
writeln(b.ptr); // but notice how close those ptrs are
assert(b.ptr == a.ptr + 2); // yes, b is a slice of a
}
replace
も代替はありませんが、実際には行われなかった場合は、元の文字列が返されます:
string a = " foo ";
string b = a.replace("p", "a"); // there is no p to replace
assert(a.ptr is b.ptr); // so same string returned
インデックスと反復が新しい必要がありませんが割り当て(もちろん)。信じられないかもしれませんが、スライスの最後にまだ使われていないメモリが残っていることがあるので、時々追加されることもありません。
また、範囲のオブジェクトを返すさまざまな関数があります。これらの関数は、繰り返しを繰り返すときに変更を行い、割り当てを避けます。たとえば、replace(a, "f", "");
の代わりに、filter!(ch => ch != 'f')(a);
とループスルーのようなことがあります。ループスルーは、要求しない限り新しい文字列を割り当てません。
だから、あなたが思っているよりも微妙なニュアンスがあります。
'string * str_ptr;の違いは何ですか? str_ptr = writeln(str_ptr); 'とwriteln(str.ptr); –
'&str'はARRAYへのポインタで、 'str.ptr'はCONTENTへのポインタです。 –