2016-06-16 19 views
0

私は、既存の配列で新しい配列を作成することについていくつか混乱しています。ある配列を他の配列と等しく設定した場合、残りのコードに対して動的にリンクされるようです。これはコンパイラの属性ですか、それとも正しい関数を使って別の配列の値を格納していませんか?私はこれが非常に基本的な質問ではないことを願っています。Ruby:動的にリンクされた配列

main_arr = [1, 2, 3, 4, 5] 
temp_arr = main_arr 
puts "Main: " + main_arr.to_s 
puts "Temp: " + temp_arr.to_s 

main_arr.clear 
puts "Main: " + main_arr.to_s 
puts "Temp: " + temp_arr.to_s 

出力:それは本当だ

Main: [1, 2, 3, 4, 5] 
Temp: [1, 2, 3, 4, 5] 
Main: [] 
Temp: [] 
+0

'A'があなたの配列である場合は、' a.dup'は "浅い" コピーを作成します。 。たとえば、a = [[1,2]、[3,4]]とします。そして、 'b = a.dup#=> [[1,2]、[3,4]]'となります。ここまでは順調ですね。ここで要素を 'b'に追加することができます: 'b << 'dog' #=> [[1、2]、[3,4]、" dog "]'。 'a'は変更されません:' a#=> [[1,2]、[3,4]] '。 'b [1] [0]#=> 3'を考えてみましょう。さて、 'b'の要素を変更し、' a'にどうなるか見てみましょう: 'b [1] [0] = 'cat'; b#=> [[1、2]、["cat"、4]、 "dog"]; a#= [[1、2]、["cat"、4]] 'と入力します。あなたが期待していたものではありませんか?これは、 'dup'が' a'の「浅い」コピーを作成するためです。 –

答えて

1

、あなたの2行目にあなたはmain_arrが指す配列オブジェクトへtemp_arrayポイントを作っています。あなたはその配列のコピーを作成する場合は、この操作を行うときは、

b = a.dup 
+0

ああ完璧!これは配列のRubyドキュメントではカバーされていないのは奇妙です。 –

+0

'#dup'が' Object'にあるからです:http://ruby-doc.org/core-2.3.1/Object.html#メソッド-i-dup – jmschles

+0

'Array.instance_method(:dup).owner#=> Kernel'、' [] .method(:dup).owner#=>カーネルのようなインスタンスメソッドのオーナーを見つけることができます。 '。 'Kernel'のインスタンスメソッドは、[Object(Object)]に記述されています(実際には' Array.instance_method(:dup)#=>#

0

を行うことができます。temp_arr = main_arrそれはtemp_arrがアドレスをmain_arrを指していることを意味します。代わりにtemp_arr = main_arr.dupを使用してコピーしてください。

main_arr = [1, 2, 3, 4, 5] 
temp_arr = main_arr **means** temp_arr -> [1, 2, 3, 4, 5] 

ので、あなたがこれを行うときmain_arr.clear -> []ともtemp_arr -> []

0

はやってみます

main_arr = [1,2,3,4,5] 
temp_arr = main_arr.dup 

main_arr.clear 
puts main_arr # => [] 
puts temp_arr # => [1,2,3,4,5] 
関連する問題