シーケンスは参照渡しできない
前回に続き 今回もシーケンスについてです。
突然ですが、以下のコードを実行すると標準出力には何が出力されるでしょう?
var s1 = [ 1 ]; var s2 = s1; println(isSameObject(s1, s2)); // 同一インスタンスか確認答えは true です。
当たり前すぎて問題になりませんね。 ^ ^;)
では これは?
var s1 = [ 1 ]; var s2 = s1; insert 2 into s2; println(isSameObject(s1, s2)); // 同一インスタンスか確認実はこれは false になります。
上記のコードとの違いは 変数 s2 のシーケンスに 2 を追加しているだけですので、 常識で考えれば 結果は true になりそうなのに...
実際にシーケンスを標準出力してみると
s1: [ 1 ] s2: [ 1, 2 ]のように別ものになっています。
実はここに驚愕の事実が...
シーケンスはオブジェクトの参照を渡すことができない のです。
つまり、変数には シーケンスのコピーが渡されるということです。
実際は上記のように 要素が変更されるまでは コピーではなく 同一オブジェクトを参照しているのですが、 これは 要素が全く同じであれば 同じオブジェクトでもコピーしたオブジェクトでも何ら違いはないので 少しでもリソースを節約するために 本当に必要になるまで コピーするタイミングを遅らせているだけではないでしょうか。
今回のクセも気をつけないとハマりやすいです。
例えば、こんなコードは割と普通に書きそうになりますが 期待通りの動きにはなりませんので注意しましょう。
var group = Group {} var content = group.content; insert Rectangle {} into content;