回答編集履歴

2

深いコピーの方法追記

2015/02/28 08:37

投稿

otn
otn

スコア84663

test CHANGED
@@ -33,3 +33,15 @@
33
33
  浅いコピー(shallow copy)と深いコピー(deep copy)に付いて調べてみてください。
34
34
 
35
35
 
36
+
37
+ `db2 = db.clone`は浅いコピーなので、深いコピーならこの場合は、
38
+
39
+ ```lang-ruby
40
+
41
+ db2 = db.map{|x| x.map{|y| y.clone}}
42
+
43
+ ```
44
+
45
+ ですね。
46
+
47
+

1

shallow copyとdeep copyについて追記

2015/02/28 08:37

投稿

otn
otn

スコア84663

test CHANGED
@@ -1,3 +1,35 @@
1
1
  `projection`の中で、仮引数の`db`が指すオブジェクトを書き換えているので、実引数の`a`にも影響が及びます。
2
2
 
3
3
  Rubyの変数は、C等で言うとすべてポインタ(リファレンス)だと思ってください。
4
+
5
+
6
+
7
+ あと、オブジェクトを内部に含んだオブジェクト~~例えば`["A","B"]`~~の場合、`clone`や`dup`をしても複製されるのは外側のオブジェクト(例だと`[ ]`)だけで、内部に含まれたオブジェクト(`"A"`と`"B"`)は複製されず共有されます。
8
+
9
+ ```lang-ruby
10
+
11
+ a=["A","B"]
12
+
13
+ puts a.object_id #=>21104256
14
+
15
+ puts a[0].object_id #=>21104280
16
+
17
+ puts a[1].object_id #=>21104268
18
+
19
+
20
+
21
+ b=a.clone
22
+
23
+ puts b.object_id #=>21104160 aとは別オブジェクト
24
+
25
+ puts b[0].object_id #=>21104280 a[0]と同一オブジェクト
26
+
27
+ puts b[1].object_id #=>21104268 a[1]と同一オブジェクト
28
+
29
+ ```
30
+
31
+
32
+
33
+ 浅いコピー(shallow copy)と深いコピー(deep copy)に付いて調べてみてください。
34
+
35
+