回答編集履歴
2
深いコピーの方法追記
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について追記
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
|
+
|