【问题标题】:Ruby: Why freeze mutable objects assigned to constants?Ruby:为什么冻结分配给常量的可变对象?
【发布时间】:2018-04-13 07:08:42
【问题描述】:

考虑一下 rubocop 报告的这一罪行

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

我为什么要冻结这个 IP 地址?

【问题讨论】:

    标签: ruby string rubocop


    【解决方案1】:

    您应该冻结分配给IP 的值,因为您已将IP 声明为常量。这表明您不希望分配给IP 的值发生突变。

    问题在于,在 ruby​​ 中,将值分配给常量不会使值不可变。如果您改变分配给常量的值,您只会收到警告。要使该值实际上是不可变的,您需要 .freeze 分配给常量的值。冻结分配给常量的值后,如果尝试更改该值,则会遇到运行时错误。

    【讨论】:

    • 你混淆了变量和对象。
    • 不错的简洁答案。
    • @JörgWMittag 我同意我原来的措辞是草率的,所以我修改了它。谢谢。
    • @jk_ :除了提高安全性之外,冻结常量是否还有性能优势?
    • @jk_ 也许你知道如何freeze 多行文字?
    【解决方案2】:

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

    特别是,分配给不可变绑定的可变对象仍然可以改变这一事实可能会让某些人感到困惑。只需见证 Stack Overflow 上关于它的各种问题:

    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
    

    【讨论】:

    • 注意:IP = '192.168.1.1' 仍然是可能的,并且仍然会导致警告,而不是错误。
    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多