【发布时间】: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 地址?
【问题讨论】:
考虑一下 rubocop 报告的这一罪行
lib/awesomelib/aws.rb:6:10: C: Style/MutableConstant: Freeze mutable objects assigned to constants.
IP = '34.111.241.111'
^^^^^^^^^^^^^^^^
我为什么要冻结这个 IP 地址?
【问题讨论】:
您应该冻结分配给IP 的值,因为您已将IP 声明为常量。这表明您不希望分配给IP 的值发生突变。
问题在于,在 ruby 中,将值分配给常量不会使值不可变。如果您改变分配给常量的值,您只会收到警告。要使该值实际上是不可变的,您需要 .freeze 分配给常量的值。冻结分配给常量的值后,如果尝试更改该值,则会遇到运行时错误。
【讨论】:
freeze 多行文字?
冻结一个对象意味着您不再被允许对其进行变异。常量意味着您不再被允许改变绑定。 (好吧,好吧,如果你改变绑定,你会收到一个警告。)这两者配合得很好。
特别是,分配给不可变绑定的可变对象仍然可以改变这一事实可能会让某些人感到困惑。只需见证 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' 仍然是可能的,并且仍然会导致警告,而不是错误。