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


在Ruby 1.9中你可以拥有 FixnumFloat,和 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]

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

请注意,在Ruby 2.0中 Fixnums和 Float两者都是冷冻开始的 Symbol保留上述行为。所以,它慢慢变得'更好':)


9538
2017-11-20 22:00


起源



答案:


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

底线就是打电话 freeze 在一个不可变的数据类型上设置 freeze obj的状态 true,但什么都不做,因为该对象已经是不可变的。


12
2017-11-20 22:20