web-dev-qa-db-ja.com

Ruby:定数に割り当てられた変更可能なオブジェクトを凍結する理由

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定数に割り当てられた値。定数に割り当てられた値を凍結した後、値を変更しようとすると、ランタイムエラーが発生します。

14
jk_

オブジェクトをフリーズすると、オブジェクトを変更することができなくなります。定数は、バインディングを変更することが許可されなくなったことを意味します。 (まあ、大丈夫、バインディングを変更すると警告が表示されます。)2つはうまく連携します。

特に、不変のバインディングに割り当てられた変更可能なオブジェクトがまだ変更可能であるという事実は、混乱を招く可能性があります。それに関するスタックオーバーフローに関するさまざまな質問をご覧ください。

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
15
Jörg W Mittag