青山です。

Wed, Apr 07, 1999 at 06:37:40PM +0900 において
中村暁史 さん曰く:

> で、その固められたモノ「が」指してる別のロッカーは
> 無関係だから別途いじれるわけですね(^^;

ここもわかりやすい説明というのは難しいですね。

ロッカーの中身が別のロッカーの札の場合、その別のロッカーの中身を変更す
る事は可能です。

$ ruby -e 'value = ["a"]; value.freeze; value[0].concat "b"; p value'
["ab"]

しかし、その鍵がかかったロッカーの中身自体はやはり変更できません。

$ ruby -e 'value = ["a"]; value.freeze; value.concat "b"; p value'
/tmp/rba00410:1:in `concat': can't modify frozen array (TypeError)
        from /tmp/rba00410:1

value の示すロッカーの中身は "a" の入った別のロッカーの札であり、
freeze するとその札以外はもやは入れられない。しかし、"a" の入ったロッ
カーには鍵がかかっていないので、"a" には追加できる。と。そんな感じでしょ
うか。

で、そのロッカーはもちろん追加だけでなく入れ換えもできないのですが、

$ ruby -e 'value = ["a"]; value.freeze; value[0] = "b"; p value'
/tmp/rba00419:1:in `[]=': can't modify frozen array (TypeError)
        from /tmp/rba00419:1

そのロッカーの番号を書いてあった value という札の方は、やはり依然とし
て消しゴムで消して新たなロッカーの番号に書き換えられる。と。

$ ruby -e 'value = ["a"]; value.freeze; value = "b"; p value'
"b"


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>