0

ruby がクラスのインスタンス変数を上書きするのはなぜ@var1ですか?

require 'pp'
class Foo
  @@def = { :key1 => "someval1", :key2 => "someval2" }
  def initialize
    @var1 = @var2 = @@def
    @var1[:key1] = "newval1"
    @var2[:key1] = "newval2"
    pp(@var1)
    pp(@var2)
  end
end
f = Foo.new

出力

{:key1=>"newval2", :key2=>"someval2"}
{:key1=>"newval2", :key2=>"someval2"}

どうしてこうなったのか教えてください。どうすればそれを回避できますか?

4

2 に答える 2

3

これは、両方の変数を同じハッシュを指すように設定したために発生します。1 つを編集すると、3 つの変数 (@@def を含む) すべてが同じハッシュであるため、すべて編集されます。

これを回避する最も簡単な方法はclone、ハッシュを使用することです。

@var2 = @@def.clone
@var1 = @@def.clone
于 2012-10-22T15:00:52.207 に答える
1

@var1@var2は同じオブジェクトへの参照であるためです。

それらに別々の値を維持させたい場合は、コピー @@defする必要があります。

于 2012-10-22T14:58:27.987 に答える