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