じろう

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時間