D 2.0で遊んでいると、次の問題が見つかりました。
例1:
pure string[] run1()
{
string[] msg;
msg ~= "Test";
msg ~= "this.";
return msg;
}
これはコンパイルされ、期待どおりに機能します。
文字列配列をクラスでラップしようとすると、これを機能させることができません。
class TestPure
{
string[] msg;
void addMsg( string s )
{
msg ~= s;
}
};
pure TestPure run2()
{
TestPure t = new TestPure();
t.addMsg("Test");
t.addMsg("this.");
return t;
}
addMsg関数が不純であるため、このコードはコンパイルされません。TestPureオブジェクトを変更するため、その関数を純粋にすることはできません。私は何かが足りないのですか?それともこれは制限ですか?
以下はコンパイルします:
pure TestPure run3()
{
TestPure t = new TestPure();
t.msg ~= "Test";
t.msg ~= "this.";
return t;
}
〜=演算子は、msg配列の不純な関数として実装されていませんか?なぜコンパイラはrun1関数でそれについて文句を言わないのですか?