为什么可以改变冻结常数?

时间:2014-08-13 11:34:16

标签: ruby

为什么可以执行以下操作?我不指望它。

CAD={:hey => {a: [1], b: [2]}}.freeze
CAD.frozen?     #=> true 
p=CAD[:hey][:a] #=> [1] 
p << nil        #=> [1, nil] 
CAD             #=> {:hey=>{:a=>[1, nil], :b=>[2]}}

更新

我找到了一个解决方案,感谢答案:http://blog.flavorjon.es/2008/08/freezing-deep-ruby-data-structures.html

1 个答案:

答案 0 :(得分:5)

仅冻结CAD表示的哈希对象,而不冻结哈希上引用的其他对象,如CAD[:hey][:a]

> CAD={:hey => {a: [1], b: [2]}}.freeze
=> {:hey=>{:a=>[1], :b=>[2]}}
> CAD.frozen?
=> true
> CAD[:hey].frozen?
=> false
> CAD[:hey][:a].frozen?
=> false