teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

深いコピーの方法追記

2015/02/28 08:37

投稿

otn
otn

スコア86349

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について追記

2015/02/28 08:37

投稿

otn
otn

スコア86349

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)に付いて調べてみてください。