include vise les instances ; extend vise un objet.include targets instances; extend targets one object.
Le № 2 a inséré des modules dans la chaîne d'une classe, pour ses instances. extend déplace la greffe d'un cran : il mixe un module sur un seul objet. Et comme une classe est elle-même un objet (Vol 1), extend dans un corps de classe produit des méthodes de classe — l'idiome le plus courant. Sur un objet ordinaire, c'est un décorateur ponctuel : on équipe cette instance-là, et elle seule. Même module, même mécanique de chaîne, mais appliquée à l'objet plutôt qu'au moule qui le fabrique.№ 2 inserted modules into a class's chain, for its instances. extend moves the graft one notch: it mixes a module onto a single object. And since a class is itself an object (Vol 1), extend in a class body produces class methods — the most common idiom. On an ordinary object, it's a one-off decorator: you equip that instance, and it alone. Same module, same chain mechanics, but applied to the object rather than the mold that makes it.
module Helpers def help = "j'aide #{self}" end # extend mixe sur UN objet précis — pas sur toutes les instances obj = Object.new obj.extend(Helpers) obj.help # => "j'aide #<Object>" greffé sur CET objet seul # et comme une classe EST un objet (Vol 1)… class Widget extend Helpers # …extend dans une classe = méthode de CLASSE end Widget.help # => "j'aide Widget" Widget.new.respond_to?(:help) # => false les instances ne l'ont pas
Sous le capot, obj.extend(M) revient à inclure M dans la classe singleton de l'objet — sa chaîne d'ancêtres personnelle (Vol 1). C'est la même mécanique que le № 2, appliquée à un objet unique.Under the hood, obj.extend(M) amounts to including M in the object's singleton class — its personal ancestor chain (Vol 1). It's the same mechanics as № 2, applied to a single object.
« Cette méthode doit répondre sur les instances (include) ou sur cet objet précis (extend) ? » Le plus souvent, extend dans une classe sert à poser des méthodes de classe — un constructeur nommé, une fabrique, une config. Sur une instance, il décore au cas par cas."Should this method answer on instances (include) or on this precise object (extend)?" Most often, extend in a class lays down class methods — a named constructor, a factory, a config. On an instance, it decorates case by case.
Ce numéro ferme le Vol 5 en élargissant la question du partage : après l'espace de noms (№ 1) et la chaîne (№ 2), on mixe au niveau d'un objet — puis on prend du recul. Car tout ce volume tourne autour d'un arbitrage qu'on va enfin nommer : avant d'hériter ou de mixer, ai-je besoin d'être cette chose, ou seulement de savoir faire ce qu'elle fait ? La composition, souvent, répond mieux.This issue closes Vol 5 by widening the sharing question: after the namespace (№ 1) and the chain (№ 2), we mix at the object level — then step back. Because this whole volume circles a call we'll finally name: before inheriting or mixing, do I need to be this thing, or only to know how to do what it does? Composition often answers better.