3

定数を変数に割り当てて更新すると、定数が更新されるのはなぜですか? それは予想される動作ですか、それともバグですか?

ruby-1.9.3-p0 :001 > A = { :test => '123' }
 => {:test=>"123"} 
ruby-1.9.3-p0 :002 > b = A
 => {:test=>"123"} 
ruby-1.9.3-p0 :003 > b[:test] = '456'
 => "456" 
ruby-1.9.3-p0 :004 > A
 => {:test=>"456"} 
4

2 に答える 2

7

これは予期される動作ですが、その理由は必ずしも明らかではありません。これは、Ruby のような言語では非常に重要な違いです。ここでは、次の 3 つのことが行われます。

  1. 定数A

  2. 変数b

  3. ハッシュ{ :test => '123' }

最初の 2 つは、両方の種類の変数です。3 つ目はオブジェクトです。変数とオブジェクトの違いは非常に重要です。変数はオブジェクトを参照するだけです。同じオブジェクトを 2 つの変数に割り当てると、それらは両方とも同じオブジェクトを参照します。作成されたオブジェクトは 1 つだけだったので、それを変更すると、両方の変数が変更されたオブジェクトを参照します。

于 2012-04-10T06:06:33.127 に答える
3

これは、浅いコピー メカニズムによるものです。あなたの例では、 A と b は実際には同じオブジェクトへの参照です。その使用を避けるには:

b = A.dup

これは、同じハッシュを指すのではなく、A のコピーで b を初期化します (つまり、ディープ コピーを使用します)。

詳細については、ここで浅いコピーと深いコピーとは何かを参照してください。

于 2012-04-10T05:53:03.240 に答える