
じろう
2019年11月02日に参加
学習履歴詳細
[Ruby]公式模擬問題集、REx、合格教本の模擬試験を解いて解説を読む。浅いコピー、階層構造について質問の回答へ返信する。
今日の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追い込み
Ruby
2021年04月24日(土)
6.0時間