这是我无法理解的代码的简化版本:
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.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其原始价值。
编辑:再次看这个问题,我想到了为什么会发生这种情况:您实际上只是为您的局部变量分配了一个引用。在本地更改值也会更改原始哈希中的值。您可能想尝试.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