为什么冻结分配给常量的可变对象?

ame*_*ior 11 ruby string rubocop

考虑一下rubocop报告的这种攻击

lib/awesomelib/aws.rb:6:10: C: Style/MutableConstant: Freeze mutable objects assigned to constants.
    IP = '34.111.241.111'
     ^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 15

冻结对象意味着您不再允许变异.常量意味着您不再允许变更绑定.(好吧,如果你改变绑定,你会得到一个警告.)两者只是很好地结合在一起.

特别是,分配给不可变绑定的可变对象仍然可以变异的事实可能会使某些人感到困惑.只是见证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
Run Code Online (Sandbox Code Playgroud)

  • 注意:仍然可以使用“ IP ='192.168.1.1'”,并且仍然会产生警告,而不是错误。 (2认同)

jk_*_*jk_ 14

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

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