質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2122閲覧

配列のコピーについて

manman

総合スコア233

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2014/11/03 13:20

配列のコピーについて
http://www2u.biglobe.ne.jp/~MAS/ruby/C7DBCEF3A4CEA5B3A5D4A1BC.html
にも書いてあるようなのですが、
「浅いコピーですむ場合」と「深いコピーが必要な場合」
の違いがわかりません。
どのように区別すればいいか教えていただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず、「浅いコピー」の場合には配列などのメンバーはコピー先と共有されます。

lang

1a = [1, "foo", true] 2b = a.clone

というような配列の浅いコピーをした場合、次のようなイメージです。

a = [1, ○, true] ↓ "foo" ↑ b = [1, ○, true]

ここで破壊的なメソッドを使ったりすると、わかりづらい結果になります。

lang

1a[1].chop! # a のメンバーに破壊的メソッド 2 3p a # [1, "fo", true] 4p b # [1, "fo", true] b まで変わる

cf. Ruby 破壊的メソッドについて詳しく教えてください。|teratail

このように浅いコピーでは共有されているので、コピーの他方に影響を与えるということを理解した上で使う必要があります。
個人的には破壊的メソッドを使うのを避けるようにプログラミングしていれば、それほど神経質になるものでもないと思います。

なお、 C 言語を知らないと理解しづらいかもしれせんが、浅いコピーで十分なケースもあります。
それはメンバーがすべて小さな整数値やブール値の場合です。
内部的に文字列などの通常のオブジェクトは変数がポインターを持っているのに対して、整数やブールでは値を直接持っています。
そのため、浅いコピーで十分ですし、それらには破壊的メソッドもありません。

リンクとして挙げられているページは、その辺のところを踏まえて読むとわかりやすいと思います。

投稿2014/11/04 04:31

yohshiy

総合スコア863

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのコピーされた物をその後どうしたいのかによります。

コピー元の配列要素からポイントされているオブジェクトをコピー先でも共用したいのなら、浅いコピーだし、共用せずに同じ値を持った別のオブジェクトとして扱いたいのなら、深いコピーだし。

そもそも、
a = b
とするのか、
a = b.clone
とするのかの使い分けは理解されていますか?
それが理解できているなら、それの単純な応用です。

投稿2014/11/03 14:08

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問