代码之家  ›  专栏  ›  技术社区  ›  american-ninja-warrior

Ruby:为什么冻结分配给常数的可变对象?

  •  18
  • american-ninja-warrior  · 技术社区  · 8 年前

    考虑一下rubocop报道的这一违法行为

    lib/awesomelib/aws.rb:6:10: C: Style/MutableConstant: Freeze mutable objects assigned to constants.
        IP = '34.111.241.111'
         ^^^^^^^^^^^^^^^^
    

    为什么要冻结此IP地址?

    2 回复  |  直到 6 年前
        1
  •  27
  •   jk_    8 年前

    您应该冻结分配给的值 IP 因为你已经声明 是一个常数。这表明您不希望将值分配给 IP 被变异。

    问题是,在ruby中,将值赋给常数并不能使该值不变。如果你改变分配给常数的值,你只会得到一个警告。要使值实际上不可变,您需要 .freeze 分配给常数的值。冻结分配给常数的值后,如果试图更改该值,则会出现运行时错误。

        2
  •  20
  •   Jörg W Mittag    8 年前

    冻结对象意味着不再允许对其进行变异。常数意味着不再允许您变异绑定。(好吧,如果你改变绑定,你会得到一个警告。)这两个人相处得很好。

    特别是,分配给不可变绑定的可变对象仍然可以变异,这一事实可能会让一些人感到困惑。只需看看有关堆栈溢出的各种问题:

    IP = '34.111.241.111'
    # Dis is a constant, I can never change it, amirite?
    
    IP << '.255'
    
    IP
    #=> '34.111.241.111.255'
    # Ooops!
    
    IP.freeze
    
    IP << '.255'
    # RuntimeError: can't modify frozen String
    
    推荐文章