在Ruby中冻结符号和数字的用途或效果是什么?
在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?
任何原因frozen?
请注意,在Ruby 2.0 Fixnum
和Float
两者都以冻结开始,而Symbol
保留上述行为。 所以,它慢慢变得’更好’:)
答案是不。 这些数据类型是不可变的。 没有理由冻结这些数据类型。 Ruby没有将这些数据类型报告为冻结的原因是因为obj.frozen?
method返回对象的冻结状态,对于不可变数据类型,它最初设置为false
。 调用obj.freeze
会将该对象的freeze
状态设置为true
。
底线是,对不可变数据类型的调用freeze
将obj的freeze
状态设置为true
,但不执行任何操作,因为该对象已经是不可变的。