在Ruby中冻结符号和数字有什么用?

Phr*_*ogz 17 ruby ruby-1.9

在Ruby 1.9中,您可以拥有Fixnum,Float以及Symbol未解冻或冻结的值:

irb(main):001:0> a = [ 17, 42.0, :foo ]; a.map(&:frozen?)
=> [false, false, false]

irb(main):002:0> a.each(&:freeze); a.map(&:frozen?)
=> [true, true, true]
Run Code Online (Sandbox Code Playgroud)

我理解冻结字符串,数组或其他可变数据类型的实用程序.据我所知,然而Fixnum,SymbolFloat实例是从一开始就一成不变的.是否有任何理由冻结它们(或者Ruby不会报告它们的任何原因)frozen?

请注意,在Ruby 2.0 FixnumFloats中,两者都以冻结开始,而Symbols保留上述行为.所以,它慢慢变得'更好':)

Ale*_*lex 17

答案是不.这些数据类型是不可变的.没有理由冻结这些数据类型.Ruby不会将这些数据类型报告为冻结的原因是因为该obj.frozen?方法返回对象的冻结状态,并且false最初设置为不可变数据类型.调用obj.freeze将为该对象设置freeze状态true.

底线是调用freeze不可变数据类型将freezeobj 的状态设置为true,但不执行任何操作,因为该对象已经是不可变的.