2017-02-24 7 views
0

私は現在、クラスの中にあるメソッドの中で作業しています。コピーされた配列が元のようになります

私はそうのように私の配列を複製しようとした:

fakearray = [] 
@puzzarray.each_index do |row| 
    fakearray << @puzzarray[row] 
end 

そして

fakearray = @puzzarray.clone 

が、私は@puzzarrayをプリントアウトするとき、私はそれは私がfakearrayのためにしたすべての変更を保持していることに気づきました。 fakearrayの目的は、私のコードが@puzzarrayで実行される前に動作していたかどうかを確認するためにクローンとして使用することでしたが、それでもやはりすべての悪い変更を保ちました。助言がありますか?

+1

あなただけの '配列をdup'することができるはずです。 'fakearray = @ puzzarray.dup'です。 'object_id'、' fakearray.object_id == @ puzzarray.object_id'をチェックして、異なるオブジェクトであるかどうかを調べることができます。もしそうであれば、異なるメモリ空間にあり、相互作用はありません。 – Kris

答えて

0

clonedupのいずれかを選択する代わりに、dupのこのドキュメントをご覧ください。リンクのそのセクションには、clonedupの違いの説明があります。それをチェックし、あなたの状況に役立つかどうかを確認してください。

0

あなたが#deep_dupを使用することができactivesupport宝石の使用:あなたはMarshal.load(Marshal.dump(a))そうでない場合

a = ['asd'] 
deep_copy = a.deep_dup 
deep_copy[0] << 'dsa' #=> "asddsa" 
a #=> ["asd"] 

をできます

deep_copy = Marshal.load(Marshal.dump(a)) 
deep_copy[0] << 'dsa' #=> "asddsa" 
a #=> ["asd"] 
+0

私はこれに宝石を使うことはできません。マーシャルが私の配列の重複をどのように作成するのか、私はまだ混乱しています。私の本当の配列を台無しにすることなく、私が欲しいのは本当にすべてです。私は正直なところ、なぜ複製された配列が元のように元のように働いているのか分からない。 – jackneedshelp

+1

最初の 'Marshal.dump(a)'は 'a 'のコピーを独立したメモリ空間(バイトストリーム)にパックし、データ構造全体を効果的に複製しますが、構造体を(バイトストリームとして)マングリングします。次に、 'Marshal.load(〜)'はデータ構造体全体を新しい変数 'deep_copy'に展開します。このようにして、構造全体をオリジナルとは関係のない新しい変数に複製しました。あなたは 'マーシャル 'のことを慎重に考えなければなりません。一部のオブジェクトは正しく処理できません。 (参考:https://ruby-doc.org/core-2.2.2/Marshal.html) –

+1

また、「複製配列」と言うと、実際には 'Object'の仕様に従って' clone'を使用しています状態は "objの浅いコピーを生成します - objのインスタンス変数はコピーされますが、参照されるオブジェクトはコピーされません。" 「浅い」コピーは、同じデータを指す別のオブジェクトを提供します。その新しいオブジェクトのデータを操作することでオリジナルが変更されます。他の人が述べているように、古いデータの状態を変更して古いオブジェクトの状態だけを残しておきたい場合、 'Marshal'lingや' dup'を使うことがやり方です。 –

0

私は@puzzarrayは、(サブ)の配列を含む配列であることを推測しています。その場合、このコード

fakearray = [] 
@puzzarray.each_index do |row| 
    fakearray << @puzzarray[row] 
end 

実際には新しい配列を作成しますが、非常に同じサブアレイが含まれています。ドキュメントによると、<<メソッドは、 "指定したオブジェクトをこの配列の最後にプッシュします"。指定されたオブジェクトであり、コピーではありません。これは、救済する必要があります:

fakearray = [] 
@puzzarray.each_index do |row| 
    fakearray << @puzzarray[row].dup 
end 

これは、同じことを達成するための短い方法です:

fakearray = @puzzarray.map(&:dup) 
関連する問題