Vol. 6 · № 00 · Un atelier RubyA Ruby workshop

Le fil du Vol 6, ou intercepter, générer, rouvrir The thread of Vol 6, or intercept, generate, reopen

Avant les quatre numéros, le pourquoi. La métaprog est code qui écrit du code (Vol 1) — et chaque outil gagne en portée (un objet, une classe, tout le programme) ce qu'il perd en traçabilité. Vise toujours le cran le plus faible qui suffit ; et d'abord, demande si une méthode explicite ne réglait pas la question. Before the four issues, the why. Metaprogramming is code that writes code (Vol 1) — and each tool gains in reach (one object, one class, the whole program) what it loses in traceability. Always aim for the weakest rung that suffices; and first, ask whether an explicit method didn't settle it.

AudienceAudience
Avant d'ouvrir le volume : pourquoi ces quatre numéros, dans cet ordre Before opening the volume: why these four issues, in this order
Format
Self-paced
ChapitresChapters
3
Date
Avr 2026 Apr 2026
≈ 3 min ●○○○ Le filMétaprogrammation
SommaireContents ·
№ —La tensionThe tension1 min

Du code qui écrit du code — et qui se cache du lecteur.Code that writes code — and hides from the reader.

Ce frontispice n'enseigne pas un mécanisme : il dit le fil qui relie les quatre numéros du volume. La métaprogrammation est la conséquence directe du Vol 1 — si tout est objet, alors les classes et les méthodes aussi se manipulent à l'exécution. La puissance est réelle ; le prix l'est tout autant. Chaque outil de métaprog ajoute du comportement que ni un lecteur, ni un grep, ni un débogueur ne retrouvent aussi facilement qu'une méthode écrite à la main. Tout le volume tient dans un seul arbitrage, posé avant chaque ligne.This frontispiece teaches no mechanism: it states the thread linking the volume's four issues. Metaprogramming is the direct consequence of Vol 1 — if everything is an object, then classes and methods too are manipulated at runtime. The power is real; the price just as much. Every metaprogramming tool adds behavior neither a reader, nor a grep, nor a debugger finds as easily as a hand-written method. The whole volume fits one call, asked before each line.

Le réflexe du volume : ai-je vraiment besoin de générer ce comportement, ou une méthode explicite suffisait-elle ?The volume's reflex: do I really need to generate this behavior, or would an explicit method have done?
№ —Le filThe thread1 min

Trois crans de portée — un objet, une classe, tout le programme.Three rungs of reach — one object, one class, the whole program.

Les trois premiers numéros ne sont pas trois recettes : ils montent une échelle. À chaque barreau, l'outil porte plus loin — et ce gain de portée se paie en traçabilité. Intercepter ne crée rien (le plus invisible). Générer crée de vraies méthodes (visibles, mais magiques). Rouvrir change des classes qu'on n'a pas écrites (visible, mais à distance, sur tout le programme). La discipline est la même à chaque barreau : descends au cran le plus faible qui suffit — et, tout en bas de l'échelle, demande si une méthode explicite ne réglait pas déjà la question. Le quatrième numéro referme le volume en revenant au fil rouge : pourquoi, justement, on passe l'objet et on envoie le message plutôt que de figer une méthode.The first three issues aren't three recipes: they climb a ladder. At each rung the tool reaches further — and that reach is paid in traceability. Intercepting creates nothing (the most invisible). Generating creates real methods (visible, but magic). Reopening changes classes you didn't write (visible, but at a distance, across the whole program). The discipline is the same at every rung: drop to the weakest tool that suffices — and, at the very bottom of the ladder, ask whether an explicit method didn't already settle it. The fourth issue closes the volume by returning to the through-line: why, precisely, you pass the object and send the message rather than freezing a method.

L'échelle de la portéeThe ladder of reach
№ 1RouvrirReopenclasses ouvertes, monkey-patchtout le programmethe whole program▲▲▲
№ 2GénérerGeneratedefine_method, DSLune classeone class▲▲
№ 1IntercepterInterceptmethod_missingun objetone object▲
№ 0ÉcrireWritedef — l'expliciteici, maintenanthere, now·

Plus on monte, plus la portée s'élargit — et plus le prix monte avec elle. La règle de lecture du volume : vise toujours le barreau le plus bas qui résout le problème.The higher you climb, the wider the reach — and the higher the price climbs with it. The volume's reading rule: always aim for the lowest rung that solves the problem.

№ —Les numéros du volumeThe volume's issues1 min

Intercepter, générer, rouvrir — et le contre-exemple à chaque fois.Intercept, generate, reopen — and the counter-example each time.

№Le mécanismeThe mechanismCe qu'il installeWhat it installs
1method_missing — interceptermethod_missing — interceptRépondre à l'inconnu, mais jamais sans respond_to_missing? — et seulement pour un ensemble ouvert.Answer the unknown, but never without respond_to_missing? — and only for an open set.
2define_method — générerdefine_method — generateCréer de vraies méthodes (ce que fait attr_accessor) — quand les noms sont des données, pas du texte fixe.Create real methods (what attr_accessor does) — when names are data, not fixed text.
3classes ouvertes — rouvriropen classes — reopenChanger n'importe quelle classe — et pourquoi le refinement, local, bat le monkey-patch global.Change any class — and why the local refinement beats the global monkey-patch.
4method vs message — la codamethod vs message — the codaRéifier une méthode fige un instantané ; envoyer le message ré-résout — pourquoi on passe l'objet, pas obj.method(:m). Retour au fil rouge : tout est message.Reifying a method freezes a snapshot; sending the message re-resolves — why you pass the object, not obj.method(:m). Back to the through-line: everything is a message.
Un volume, une échelle : chaque numéro monte d'un cran en portée, et la prudence redescend d'autant.One volume, one ladder: each issue climbs a rung in reach, and caution climbs down by the same.