2016-11-12 8 views
1

奇妙な問題に直面しています。私は以下の配列を持っています。私も元の配列からassigned_arrayから要素途中の削除を削除するだから私は今、別の配列変数にruby​​配列を別の変数に代入し、その配列から元の配列で削除された変数を削除する場合

irb(main):011:0> assigned_array = [] 
=> [] 
irb(main):012:0> assigned_array = original_array 
=> ["word1", "word2"] 
irb(main):013:0> 
irb(main):014:0> puts "#{assigned_array.inspect}" 
["word1", "word2"] 
=> nil 
irb(main):015:0> 

をこの配列が割り当てられている

irb(main):007:0> original_array = [] 
=> [] 
irb(main):008:0> original_array.push("word1") 
=> ["word1"] 
irb(main):009:0> original_array.push("word2") 
=> ["word1", "word2"] 
irb(main):010:0> puts "#{original_array.inspect}" 
["word1", "word2"] 
=> nil 
irb(main):011:0> 

irb(main):015:0> assigned_array.delete("word2") 
=> "word2" 
irb(main):016:0> puts "#{assigned_array.inspect}" 
["word1"] 
=> nil 
irb(main):017:0> puts "#{original_array.inspect}" 
["word1"] 
=> nil 

実際のルビーの動作を確認できません。もしそうなら、original_arrayからassigned_arrayから削除してはならない要素をassigned_arrayから削除すると、original_arrayをassigned_array変数に代入する方法はありますか?

+0

、私はあなたがそのように行う必要はありません単一のポイントをポイントしたいと思い、それは 'IRB(メイン)、である:011:0>最初の配列を作成する必要はありません。なぜなら、2行目に別の配列を割り当てるからです。最初に配列を作成するので、最初に配列を作成する必要はありません。消去される。あなたがこれを理解すれば、それはあなたの理解を深めるでしょう。したがって、配列として宣言する必要のない変数に配列を直接割り当てることができます。 – Gopal

答えて

3

はいこれはルビーの動作です。 assigned_array = original_array.cloneでコピーできます。注:これにより、浅いコピーが作成されます(詳細はを参照してください)

リテラル以外の非リテラル(a = b)からの非リテラルの割り当ては、参照のオブジェクトの内容をコピーしません。結果は、original_arrayとassigned_arrayの両方が配列の同じインスタンスであるため、同じオブジェクトであるため、一方を変更すると他方が変更されます。

スクリプトの例:誰かが既に答えている

original_array = ["word1", "word2"] 
puts original_array.inspect #=> ["word1", "word2"] 
assigned_array = original_array.clone 
assigned_array.delete("word2") 
puts assigned_array.inspect #=> ["word1"] 
puts original_array.inspect #=> ["word1", "word2"] 
+1

説明をありがとうございます@Philip – Karthi1234

+0

これはPHP以外のほぼすべてのプログラミング言語の動作です。 – Aetherus

関連する問題