代码之家  ›  专栏  ›  技术社区  ›  Phrogz

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

  •  14
  • Phrogz  · 技术社区  · 14 年前

    在Ruby1.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]
    

    我了解冻结字符串、数组或其他可变数据类型的实用程序。但据我所知, 固定器 , 符号 浮标 实例从一开始就不可变。有没有理由冻结它们(或者Ruby不报告它们的原因) frozen?

    注意在Ruby2.0中 固定器 S和 浮标 S都开始冻结,而 符号 s保留上述行为。所以,它正在慢慢变得“更好”:)

    1 回复  |  直到 11 年前
        1
  •  14
  •   Alex    14 年前

    答案是否定的。这些数据类型是不可变的。没有理由冻结这些数据类型。Ruby不将这些数据类型报告为冻结的原因是 obj.frozen? 方法返回对象的冻结状态,并将其设置为 false 最初用于不可变数据类型。打电话 obj.freeze 将设置 freeze 状态为 true 为了那个目标。

    最重要的是 冻结 在不可变的数据类型上,设置 冻结 对象的状态 ,但不执行任何操作,因为对象已经是不可变的。