今日のYWT
やったこと
質問への回答を読む
新しい疑問点について書く
持っている/使えるサービスでRuby Silverの模擬試験や問題を解く
わかったこと
回答への返信
dupメソッドは認識通りshallow copy)なのですが、まずshallow copyの説明です。
shallow copyは複製を作りはするものの、インスタンスの参照自体をコピーするものではありません(インスタンスのハッシュ値が異なるため、中身は同じでも違うものをさす)
ですので、fooとbazでは値が異なっているという認識です。
ここまでは理解できました。だからobject_idも変わっているということですよね。
2つめの質問についてです。
「階層構造になっている時、その中身に対して破壊的メソッドを実行すると、元のオブジェクトの中身にも変更が起きてしまう」
この部分に関しては、Rubyの言語の仕様上そうなる、ということで納得はできます。
また、以下のようなコードを書いた時の挙動を見て、foo[0][0..3]のような書き方をすると、「階層構造の中身への破壊的メソッド実行」が起こる、ということが分かりました。
foo = ["a", "b", "c"]
baz = foo.dup
p foo # -> ["a", "b", "c"]
p foo.object_id # -> 60
p baz # -> ["a", "b", "c"]
p baz.object_id # -> 80
foo[0][1] = "c"
p foo # -> ["ac", "b", "c"]
p foo.object_id # -> 60
p baz # -> ["ac", "b", "c"]
p baz.object_id # -> 80
以下はfooの出力自体は上のコードと同じになるものの、「階層構造の中身への破壊的な変更」が起こらず元のオブジェクトが書き換わらないケースです。
foo = ["a", "b", "c"]
baz = foo.dup
p foo # -> ["a", "b", "c"]
p baz # -> ["a", "b", "c"]
foo[0] = "ac"
p foo # -> ["ac", "b", "c"]
p baz # -> ["a", "b", "c"]
また階層構造がいまいち分からなかったので調べる。≒ツリー構造と解釈。
わわわIT用語辞典 階層構造
仮説として、ツリーを考えた時に、おそらく内部では foo[0] = "ac"と foo[0][1] = "c"が違う働きをしているだろうとは思うんですが、具体的に何が違うのか……どのように違うのか、と新たな疑問が湧いてきてしまいました。
次やること
上の質問を解決したい
ツリー構造について
Ruby Silver追い込み