07/10/17 14:19:58
>>202
たとえば
class Stream {
int opApply( int delegate(ref const(char)[] line) dg );
}
こういう宣言だったとしたら、
string s;
foreach(line; din) if( line[0] == '#' ) s = line;
writeln( "#で始まってた最後の行は", s );
このコードは期待した通りに動かないかもしれない。
Streamが内部でlineの中身を勝手に再利用してるかもしれないので。
constだと、"自分が"lineの中身を書き換えることはできなくなるけど、
他のところで書き換えが起こる可能性は否定できない。
これが
class Stream {
int opApply( int delegate(ref invariant(char)[] line) dg );
}
こうだったら、opApplyの実装を見るまでもなく↑のコードは普通に動く。
invariantな配列の中身はもう"誰も"書き換えないので、Streamが後で
書き換えるようなことがない。
とかそういう使い方。