在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]
我理解冻结字符串,数组或其他可变数据类型的实用程序。但据我所知,Fixnum
,Symbol
和Float
实例从一开始就是不可变的。是否有任何理由冻结它们(或任何原因,Ruby不会将它们报告为frozen?
请注意,在Ruby 2.0 Fixnum
和Float
中,两者都以冻结开始,而Symbol
则保留上述行为。所以,它慢慢变得“更好”:)
答案 0 :(得分:14)
答案是否定的。这些数据类型是不可变的。没有理由冻结这些数据类型。 Ruby不会将这些数据类型报告为冻结的原因是因为obj.frozen?
方法返回对象的冻结状态,并且最初为不可变数据类型设置为false
。致电obj.freeze
会将freeze
状态设置为该对象的true
。
底线是在不可变数据类型上调用freeze
会将obj的freeze
状态设置为true
,但不执行任何操作,因为该对象已经是不可变的。