L'autre réponse au partage : rendre l'objet impossible à muter.The other answer to sharing: make the object impossible to mutate.
Le numéro précédent montrait le danger : muter un objet partagé surprend tous ceux qui le tiennent. La parade y était « copie avant de muter ». freeze prend le problème par l'autre bout : au lieu de multiplier les copies, on gèle l'objet une fois pour toutes. Un objet gelé refuse toute mutation — un << ou un gsub! lève FrozenError au lieu de modifier en silence. Et si l'objet ne peut plus changer, le partager redevient parfaitement sûr : l'immutabilité, c'est l'aliasing sans le piège.The previous issue showed the danger: mutating a shared object surprises everyone who holds it. The remedy there was 'copy before mutating'. freeze takes the problem from the other end: instead of multiplying copies, you freeze the object once and for all. A frozen object refuses every mutation — a << or a gsub! raises FrozenError instead of modifying silently. And if the object can no longer change, sharing it becomes perfectly safe again: immutability is aliasing without the trap.
a = "ruby".freeze # on gèle l'objet : la mutation devient impossible b = a # b et a désignent toujours le MÊME objet a << " loop" # FrozenError: can't modify frozen String: "ruby" # ↑ la mutation est REFUSÉE, pas silencieuse a.frozen? # => true b.frozen? # => true un objet est gelé, pas une variable
freeze est à sens unique : on peut geler un objet, jamais le dégeler. À partir de là, toute tentative de mutation échoue bruyamment — l'erreur naît à la mutation fautive, pas douze frames plus loin.freeze is one-way: you can freeze an object, never thaw it. From then on, every mutation attempt fails loudly — the error is born at the offending mutation, not twelve frames later.
« Cet objet doit-il jamais changer après sa création ? Alors gèle-le, et partage-le sans crainte. » L'immutabilité transforme une donnée partagée d'un risque en une garantie : personne ne peut la muter dans ton dos, parce que personne ne le peut tout court."Should this object ever change after creation? Then freeze it, and share it without fear." Immutability turns shared data from a risk into a guarantee: no one can mutate it behind your back, because no one can mutate it at all.
Comme l'aliasing du № 1, freeze agit sur l'objet, jamais sur la variable. Geler par a gèle l'unique objet que b regarde aussi : b.frozen? devient true sans qu'on ait touché b. On peut toujours réassigner (a = "neuf" fait pointer a ailleurs) ; ce qu'on ne peut plus, c'est modifier l'objet gelé en place.Like the aliasing in № 1, freeze acts on the object, never on the variable. Freezing through a freezes the single object b looks at too: b.frozen? becomes true without touching b. You can still reassign (a = "new" points a elsewhere); what you can no longer do is modify the frozen object in place.