Un message ne « trouve » pas sa méthode : il parcourt une liste.A message doesn't "find" its method: it walks a list.
Le № 1 a montré qu'include « insère le module dans la chaîne ». Voici cette chaîne en clair. ancestors révèle l'ordre exact dans lequel Ruby cherche une méthode quand un objet reçoit un message : sa classe d'abord, puis les modules qu'elle mixe, puis sa superclasse, et ainsi de suite jusqu'à BasicObject. Le premier ancêtre qui définit la méthode gagne ; les autres ne sont jamais consultés. C'est la mécanique concrète derrière le « tout est message » du Vol 1 — résoudre un message, c'est descendre cette liste jusqu'au premier qui répond.№ 1 showed that include 'inserts the module into the chain'. Here's that chain in the open. ancestors reveals the exact order in which Ruby looks up a method when an object receives a message: its class first, then the modules it mixes, then its superclass, and so on to BasicObject. The first ancestor that defines the method wins; the others are never consulted. It's the concrete mechanics behind Vol 1's 'everything is a message' — resolving a message is walking this list down to the first that answers.
String.ancestors # => [String, Comparable, Object, Kernel, BasicObject] # └ la classe └ un mixin └ la superclasse … jusqu'à la racine # envoyer "abc".upcase, c'est PARCOURIR cette liste de gauche à droite # et s'arrêter au PREMIER ancêtre qui définit upcase : "abc".method(:upcase).owner # => String trouvé dès le 1er "abc".method(:tap).owner # => Kernel trouvé plus loin "abc".method(:equal?).owner # => BasicObject à la toute fin
Pour "abc".upcase, Ruby s'arrête au premier maillon — String — qui définit upcase. Pour tap, il descend jusqu'à Kernel. La méthode n'est pas « dans l'objet » : elle est quelque part sur le chemin.For "abc".upcase, Ruby stops at the first link — String — that defines upcase. For tap, it goes down to Kernel. The method isn't "in the object": it's somewhere on the path.
« Quand je ne comprends pas quelle méthode s'exécute, je lis ancestors. » L'ordre n'est pas une devinette : c'est une liste qu'on peut afficher, et le premier ancêtre qui définit le message l'emporte. include, prepend et l'héritage ne font qu'insérer des maillons à des positions précises."When I don't understand which method runs, I read ancestors." The order isn't a guess: it's a list you can print, and the first ancestor defining the message wins. include, prepend and inheritance only insert links at precise positions.
Ce que ancestors renvoie est l'ordre de résolution des méthodes de la classe. Tout le volume tient dans une idée : include, prepend et < (héritage) ne créent pas de magie — ils décident où, dans cette liste, un maillon s'insère. Savoir lire la chaîne, c'est savoir d'avance quelle méthode répondra, et ce que super appellera ensuite.What ancestors returns is the class's method resolution order. The whole volume fits one idea: include, prepend and < (inheritance) create no magic — they decide where, in this list, a link is inserted. Reading the chain is knowing in advance which method answers, and what super will call next.