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

Le fil du Vol 3, ou la confiance et son prix The thread of Vol 3, or trust and its price

Avant les trois numéros, le pourquoi. Ruby refuse de demander le type et fait confiance au message — une seule discipline en trois temps : la confiance (réponds-tu ?), ses présupposés (les protocoles tacites), son prix (l'erreur tardive, regagnée à la frontière). Confiance par défaut, vérification à un seul endroit. Before the three issues, the why. Ruby refuses to ask the type and trusts the message — one discipline in three beats: trust (do you answer?), its assumptions (the tacit protocols), its price (the late error, regained at the boundary). Trust by default, checking in one place.

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

Refuser de demander le type — et payer ce refus à un seul endroit.Refusing to ask the type — and paying for that refusal in one place.

Ce frontispice n'enseigne pas un mécanisme : il dit le fil qui relie les trois numéros du volume. Là où un langage statique demande « quel type es-tu ? » et le prouve à la compilation, Ruby refuse la question et fait confiance au message. Cette confiance achète la souplesse et la testabilité ; elle se paie en une garantie perdue — l'erreur glisse à l'exécution, le NoMethodError tardif. Tout le volume est une seule discipline qui se déplie : on adopte la confiance, on voit ce qu'elle suppose en silence, puis on en nomme le prix pour le borner.This frontispiece teaches no mechanism: it states the thread linking the volume's three issues. Where a static language asks 'what type are you?' and proves it at compile time, Ruby refuses the question and trusts the message. That trust buys flexibility and testability; it costs a lost guarantee — the error slips to runtime, the late NoMethodError. The whole volume is one discipline unfolding: you adopt trust, see what it silently assumes, then name its price to bound it.

Le réflexe du volume : je ne demande pas quel type tu es — je demande si tu réponds à ce message.The volume's reflex: I don't ask what type you are — I ask whether you answer this message.
№ —Le filThe thread1 min

Une seule discipline en trois temps : confiance → présupposés → prix.One discipline in three beats: trust → assumptions → price.

Les trois numéros ne sont pas trois sujets : c'est une discipline qui se déplie. Le № 1 pose la confiance — réponds au message, peu importe ta classe : c'est la liberté. Le № 2 révèle ce que cette confiance suppose en silence : des contrats tacites — to_s, <=>, each, to_proc — les « interfaces » que Ruby attend sans les nommer ; les connaître, c'est honorer la confiance. Le № 3 en nomme le prix : l'erreur tardive, loin de sa cause — et la parade n'est pas de tout vérifier mais de regagner une garantie à la frontière. La confiance est le défaut ; la vérification, une exception qu'on place avec soin.The three issues aren't three subjects: they're a discipline unfolding. № 1 lays down trust — answer the message, whatever your class: that's the freedom. № 2 reveals what that trust silently assumes: tacit contracts — to_s, <=>, each, to_proc — the 'interfaces' Ruby expects without naming them; knowing them honors the trust. № 3 names its price: the late error, far from its cause — and the remedy isn't checking everything but regaining a guarantee at the boundary. Trust is the default; checking is an exception placed with care.

La confiance, et où la bornerTrust, and where to bound it
№ 1
ConfianceTrust
réponds-tu au message ?do you answer the message?
la libertéthe freedom
→
№ 2
PrésupposésAssumptions
to_s, <=>, each…to_s, <=>, each…
les contrats tacitesthe tacit contracts
→
№ 3
Prix & paradePrice & remedy
l'erreur tardivethe late error
regagnée à la frontièreregained at the boundary

On ne renforce pas la confiance en la doublant partout : on la borne à un seul endroit, là où la donnée externe entre. Confiance par défaut, vérification à la frontière.You don't strengthen trust by doubling it everywhere: you bound it in one place, where external data enters. Trust by default, checking at the boundary.

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

Réponds, nomme le contrat, borne le prix — et le contre-exemple à chaque fois.Answer, name the contract, bound the price — and the counter-example each time.

№Le mécanismeThe mechanismCe qu'il installeWhat it installs
1Le duck typing — la confianceDuck typing — the trustLe polymorphisme sans interface : code contre un protocole, pas contre une classe. Ne teste pas le type, envoie le message.Polymorphism without interfaces: code against a protocol, not a class. Don't test the type, send the message.
2Les protocoles implicites — les présupposésImplicit protocols — the assumptionsLes « interfaces » tacites que la confiance suppose : to_s, <=>+Comparable, each+Enumerable, coercition.The tacit 'interfaces' trust assumes: to_s, <=>+Comparable, each+Enumerable, coercion.
3Quand le canard trahit — le prixWhen the duck betrays — the priceL'erreur tardive, et où regagner une garantie : au runtime (dry-struct) ou à l'analyse (Steep/RBS) — à la frontière, jamais partout.The late error, and where to regain a guarantee: at runtime (dry-struct) or at analysis (Steep/RBS) — at the boundary, never everywhere.
Le duck typing n'a pas de filet — alors tends-en un là où la donnée entre, et nulle part ailleurs.Duck typing has no net — so stretch one where the data enters, and nowhere else.