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

时间:2010-11-20 22:00:54

标签: ruby ruby-1.9

在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?

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

1 个答案:

答案 0 :(得分:14)

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

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