Во время игры с 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?