過ぎたるは及ばざるが如し

浅く広くゆるい感じのアウトプット的なメモです

kanazawa.rb meetup #27

11/15 kanazawa.rb meetup #27
http://kanazawarb.github.com/meetup/27/

「意識高いもくもく会

参加したのでアウトプットしてみる!!

MCは@kiyoharaさんです

意識高いもくもく会

今回は新規参加者が4名もいました。
その内、学生さんは3名と・・・嬉しい限りです。
高専の星・・・・個性的で素晴らしい。本当に輝いていましたw

私が行ったもくもくは「フロントエンドエンジニア養成読本」です。
1章から3章はさらっと読みました。

@wtnabeさんにrubyのcloneってdeepコピーじゃないの?と質問してみました。
この質問をするきっかけはmeetup#26のCoderetreatのライフゲームです。

ライフゲームにて二次元配列のコピーが上手くいかなかったことです。
この時使用したのが、cloneです。

回答はdeepコピーじゃないです。

[1] pry(main)> a = Array.new(3).map { Array.new(3) { Object.new} }
=> [[#<Object:0x007fdd19c595d8>, #<Object:0x007fdd19c595b0>, #<Object:0x007fdd19c59588>],
[#<Object:0x007fdd19c59538>, #<Object:0x007fdd19c59510>, #<Object:0x007fdd19c594e8>],
[#<Object:0x007fdd19c59498>, #<Object:0x007fdd19c59470>, #<Object:0x007fdd19c59448>]]
[2] pry(main)> b = a.clone
=> [[#<Object:0x007fdd19c595d8>, #<Object:0x007fdd19c595b0>, #<Object:0x007fdd19c59588>],
[#<Object:0x007fdd19c59538>, #<Object:0x007fdd19c59510>, #<Object:0x007fdd19c594e8>],
[#<Object:0x007fdd19c59498>, #<Object:0x007fdd19c59470>, #<Object:0x007fdd19c59448>]]
[3] pry(main)> b.clear
=>

上記の結果の通り、cloneでコピーしてもオブジェクトの中身がaとbで同じです。
そのため、aのオブジェクトに対して、変更するとbのオブジェクトも変わってしまいます。
これのせいで、ライフゲームが上手く動作せず、挙動不審な動作が発生しました。

[4] pry(main)> b = a.dup
=> [[#<Object:0x007fdd19c595d8>, #<Object:0x007fdd19c595b0>, #<Object:0x007fdd19c59588>],
[#<Object:0x007fdd19c59538>, #<Object:0x007fdd19c59510>, #<Object:0x007fdd19c594e8>],
[#<Object:0x007fdd19c59498>, #<Object:0x007fdd19c59470>, #<Object:0x007fdd19c59448>]]
[5] pry(main)> b.clear
=>

cloneではなく、dupについても同様の結果でした。

[6] pry(main)> b = Marshal.load(Marshal.dump(a))
=> [[#<Object:0x007fdd1d2d5eb8>, #<Object:0x007fdd1d2d5e90>, #<Object:0x007fdd1d2d5e68>],
[#<Object:0x007fdd1d2d5e18>, #<Object:0x007fdd1d2d5df0>, #<Object:0x007fdd1d2d5dc8>],
[#<Object:0x007fdd1d2d5d78>, #<Object:0x007fdd1d2d5d50>, #<Object:0x007fdd1d2d5d28>]]

Marshalを使用することによって、aとbで別のオブジェクトとして
コピーできました。
@wtnabeさんの回答と私の認識があっていて良かった良かった。
安心したせいか、Marshalじゃなくても、この方法でも大丈夫だよって
言われた書き方を忘れてしまいました。いやはや。

身近なイベント

12/20 kanazawa.rb meetup#28 LT大会

「kanazawa.rb meetup #27」をトゥギャりました。
http://togetter.com/li/746127
「kanazawa.rb meetup #27」の写真公開
http://30d.jp/kzrb/17
※30days 様のご厚意により pro アカウントを優待いただいております。