Ruby 为什么可以更改冻结常数?
为什么可以执行以下操作?我没想到会是这样Ruby 为什么可以更改冻结常数?,ruby,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]}} CAD={:hey=>{a:[1],b:[2]}。冻结
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]}}
CAD={:hey=>{a:[1],b:[2]}。冻结
CAD.freezed?#=>真的
p=CAD[:嘿][:a]#=>[1]
p[1,无]
CAD#=>{:hey=>{:a=>[1,nil],:b=>[2]}
更新
多亏了这个答案,我找到了一个解决方案:只有由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
只有由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