dup copie l'objet — mais une seule couche.dup copies the object — but one layer only.
On a vu geler un niveau (freeze) ; voici copier un niveau (dup). dup crée bien un nouvel objet de premier niveau : on peut y ajouter, retirer, réordonner sans toucher l'original. Mais ses sous-objets ne sont pas copiés — ce sont les MÊMES, partagés avec l'original. Muter un sous-tableau de la copie mute celui de l'original, exactement l'aliasing du № 1, glissé un cran plus bas. La copie de surface règle le partage du contenant, jamais celui du contenu.We saw freezing one level (freeze); here's copying one level (dup). dup does create a new top-level object: you can add, remove, reorder without touching the original. But its sub-objects aren't copied — they're the SAME, shared with the original. Mutating a sub-array of the copy mutates the original's, exactly the № 1 aliasing, slipped one notch down. Shallow copy settles the container's sharing, never the contents'.
original = [[1, 2], [3, 4]] copy = original.dup # une copie… mais de SURFACE copy << [5, 6] # le 1er niveau est bien distinct original # => [[1, 2], [3, 4]] intact copy[0] << 99 # mais copy[0] EST original[0] original # => [[1, 2, 99], [3, 4]] ← muté à distance copy[0].equal?(original[0]) # => true le même sous-objet, partagé
Les deux contenants sont distincts, mais leurs flèches retombent sur les mêmes sous-objets. dup a recopié le tableau extérieur, pas ce qu'il contient — le partage a juste descendu d'un étage.The two containers are distinct, but their arrows land on the same sub-objects. dup copied the outer array, not what it holds — the sharing just moved down one floor.
« Ma copie est-elle assez profonde pour ce que je vais en faire ? » Si je ne touche que le premier niveau, dup suffit. Si je vais muter un sous-objet, dup ne m'isole pas : il me faut copier aussi le niveau que je compte modifier."Is my copy deep enough for what I'm about to do?" If I only touch the first level, dup is enough. If I'm going to mutate a sub-object, dup doesn't isolate me: I must also copy the level I intend to change.
Le № 2 l'annonçait : freeze gèle une couche, dup en copie une. Les deux s'arrêtent au premier niveau et laissent le contenu imbriqué tel quel. La même question revient, posée à l'envers — « jusqu'où va l'opération ? » — et la même réponse : Ruby travaille au premier niveau, c'est à toi de décider du reste.№ 2 foreshadowed it: freeze freezes one layer, dup copies one. Both stop at the first level and leave nested contents as they are. The same question returns, asked in reverse — "how far does the operation reach?" — with the same answer: Ruby works at the first level, the rest is yours to decide.