зачем замораживать изменяемые объекты, назначенные константам?

Рассмотрите это преступление, о котором сообщает rubocop

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

Почему я должен заморозить этот IP-адрес?

Ответ 1

Вы должны заморозить значение, назначенное IP потому что вы указали, что IP является константой. Это означает, что вы не хотите, чтобы значение, назначенное IP было изменено.

Проблема в том, что в рубине присвоение значения константе не делает значение неизменным. Вы просто получаете предупреждение, если вы мутируете значение, присвоенное константе. Чтобы сделать значение фактически неизменным, вам нужно .freeze значение, присвоенное константе. После того, как вы заморозили значение, назначенное константе, если вы попытаетесь изменить значение, вы столкнетесь с ошибкой во время выполнения.

Ответ 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