web-dev-qa-db-fra.com

Ruby: Pourquoi geler les objets mutables assignés aux constantes?

Considérez cette infraction signalée par rubocop

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

Pourquoi devrais-je geler cette adresse IP?

13

Vous devez figer la valeur attribuée à IP car vous avez déclaré que IP est une constante. Cela indique que vous ne souhaitez pas que la valeur affectée à IP soit modifiée.

Le problème est que dans Ruby, assigner une valeur à une constante ne rend pas la valeur immuable. Vous obtenez juste un avertissement si vous mutez la valeur affectée à la constante. Pour que la valeur soit réellement immuable, vous devez .freeze la valeur affectée à la constante. Après avoir gelé une valeur affectée à une constante, si vous essayez de modifier la valeur, vous rencontrerez une erreur d'exécution.

14
jk_

Le gel d'un objet signifie que vous n'êtes plus autorisé à le muter. Une constante signifie que vous n'êtes plus autorisé à muter la liaison. (Eh bien, d'accord, vous obtenez un avertissement si vous mute la liaison.) Les deux vont bien ensemble.

En particulier, le fait qu'un objet mutable affecté à une liaison immuable puisse encore être muté, pourrait être source de confusion pour certains. Assistez simplement aux différentes questions sur Stack Overflow à ce sujet:

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