Ruby: 为什么冻结分配给常量的可变对象?
Ruby: Why freeze mutable objects assigned to constants?
考虑 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
将值分配给常量。冻结分配给常量的值后,如果您尝试更改该值,将会遇到运行时错误。
冻结一个对象意味着你不能再改变它。常量意味着您不再被允许改变绑定。 (嗯,好吧,如果你改变绑定,你会收到警告。)两者配合得很好。
特别是,分配给不可变绑定的可变对象仍然可以发生变化这一事实可能会让某些人感到困惑。看看 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
考虑 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
将值分配给常量。冻结分配给常量的值后,如果您尝试更改该值,将会遇到运行时错误。
冻结一个对象意味着你不能再改变它。常量意味着您不再被允许改变绑定。 (嗯,好吧,如果你改变绑定,你会收到警告。)两者配合得很好。
特别是,分配给不可变绑定的可变对象仍然可以发生变化这一事实可能会让某些人感到困惑。看看 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