TDPL, стр. 167:
пока изменяемое состояние в функции полностью транзитивно (т.е. выделено на стеке) и приватно (т.е. не передается по ссылке функциям, которые могут его испортить), функция может считаться чистой.
import std.stdio : writeln;
struct M{
int[4] _data;
pure ref int opIndex(size_t i){ return _data[i]; }
}
pure M foo(ref M m){
m[0] = 1234;
return m;
}
void main(){
M m1 = M([7, 7, 7, 7]);
writeln(m1);
foo(m1);
writeln(m1);
}
// output:
// M([7, 7, 7, 7])
// M([1234, 7, 7, 7])
Мутабельное состояние является транзитивным, потому что оно находится в стеке, верно? Но оно не является приватным. Так как же foo()
может модифицировать m1
?