method_missing est ce qui s'exécute au bout de la chaîne.method_missing is what runs at the end of the chain.
Le Vol 6 ouvre la métaprogrammation — du code qui écrit du code — et on y entre par prudence, pas par éblouissement. Premier outil, et le plus exposé à l'abus : method_missing. Le Vol 5 a montré qu'un message parcourt la chaîne d'ancêtres jusqu'au premier qui répond. Mais que se passe-t-il quand personne ne répond ? Ruby ne lève pas tout de suite : il envoie un dernier message, method_missing, tout au bout de la chaîne. Par défaut, BasicObject#method_missing lève le NoMethodError qu'on connaît. Le redéfinir, c'est intercepter les messages inconnus avant l'erreur — répondre à des méthodes qu'on n'a jamais écrites.Vol 6 opens metaprogramming — code that writes code — and we enter through caution, not dazzle. First tool, and the most abuse-prone: method_missing. Vol 5 showed a message walks the ancestor chain to the first that answers. But what happens when no one answers? Ruby doesn't raise right away: it sends one last message, method_missing, at the very end of the chain. By default, BasicObject#method_missing raises the NoMethodError we know. Redefining it intercepts unknown messages before the error — answering methods you never wrote.
"abc".wat # NoMethodError: undefined method 'wat' for an instance of String # ↑ Ruby a parcouru TOUTE la chaîne d'ancêtres (Vol 5), rien n'a répondu — # alors il appelle method_missing au bout, qui par défaut lève l'erreur class Ghost def method_missing(name, *args, &block) # on intercepte AVANT l'erreur "tu as appelé #{name} avec #{args.inspect}" end end Ghost.new.anything(1, 2) # => "tu as appelé anything avec [1, 2]" Ghost.new.wat # => "tu as appelé wat avec []"
Le message a traversé toute la chaîne sans trouver de méthode. method_missing est le filet au bout : redéfini, il décide quoi faire ; laissé tel quel, il lève. Ce n'est pas une exception détournée — c'est un message comme un autre, le tout dernier.The message crossed the whole chain without finding a method. method_missing is the net at the end: redefined, it decides what to do; left as is, it raises. It's not a hijacked exception — it's a message like any other, the very last one.
« Si je définis method_missing, je définis toujours son jumeau respond_to_missing?. » Le couple est obligatoire : sans le second, l'objet répond à des messages mais prétend ne pas les connaître. On verra au chapitre suivant pourquoi ce mensonge casse le duck typing du Vol 3."If I define method_missing, I always define its twin respond_to_missing?." The pair is mandatory: without the second, the object answers messages but claims not to know them. The next chapter shows why that lie breaks Vol 3's duck typing.
La métaprog est le volume le plus exposé à l'abus, et method_missing son premier piège : c'est le réflexe paresseux qui fait « marcher » un objet magique sans qu'on écrive les méthodes. La puissance est réelle — proxies, délégateurs, finders dynamiques — mais chaque message intercepté est un message invisible au lecteur et au grep. On apprend l'outil et son prix dans le même numéro.Metaprogramming is the most abuse-prone volume, and method_missing its first trap: it's the lazy reflex that makes a magic object "work" without writing the methods. The power is real — proxies, delegators, dynamic finders — but each intercepted message is a message invisible to the reader and to grep. We learn the tool and its price in the same issue.