在Ruby中冻结符号和数字的用途或效果是什么?

在Ruby 1.9中,您可以获得解冻或冻结的FixnumFloatSymbol值:

 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] 

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

请注意,在Ruby 2.0 FixnumFloat两者都以冻结开始,而Symbol保留上述行为。 所以,它慢慢变得’更好’:)

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

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