是否有可能使常数不变?

时间:2013-10-23 15:29:24

标签: ruby-on-rails ruby

以下是我无法理解的代码的简化版本:

1.9.3p448 :004 > a = {a: 1, b: 2}
 => {:a=>1, :b=>2} 
1.9.3p448 :005 > b = a
 => {:a=>1, :b=>2} 
1.9.3p448 :006 > b[:c] = 3
 => 3 
1.9.3p448 :007 > a
 => {:a=>1, :b=>2, :c=>3} 
1.9.3p448 :008 > 

我不明白为什么a会发生变化。 只想更改b并保留a原始值。

1 个答案:

答案 0 :(得分:0)

编辑: 再看一下这个问题,我才知道为什么会发生这种情况: 实际上,您只是为本地变量分配了一个引用。在本地更改值也会更改原始哈希值内的值。您可能需要尝试.dup来获取值的副本。 它只是一个浅的副本,所以根据你可能在那里的对象,它可能无法完全工作。

原件:

您可以使用freeze防止其被更改。如果应用更改,将抛出RuntimeError。它仍然没有100%的保护,但它会发生意外的变化。

CONSTANT = {:key1 => 'some value', :key2 => 'some other value'}.freeze

请参阅此处的文档: http://www.ruby-doc.org/core-2.0.0/Object.html#method-i-freeze

这里有一个有限的咆哮: http://m.onkey.org/ruby-i-don-t-like-3-object-freeze