Une seule méthode, et tout le langage te reconnaît.One method, and the whole language recognizes you.
Le duck typing disait : réponds au message. Mais à quels messages ? Ruby en attend certains sans jamais te les déclarer — ce sont ses protocoles implicites. Définis to_s sur ton objet, et d'un coup puts l'affiche, l'interpolation l'insère, print l'accepte. Tu n'as branché ton objet sur rien : tous ces endroits appellent to_s par convention, et ta classe vient de rejoindre une « interface » que personne n'a écrite.Duck typing said: answer the message. But which messages? Ruby expects certain ones without ever declaring them to you — its implicit protocols. Define to_s on your object, and suddenly puts prints it, interpolation inserts it, print accepts it. You wired your object into nothing: all those places call to_s by convention, and your class just joined an 'interface' nobody wrote.
class Temperature def initialize(celsius) = @c = celsius def to_s = "#{@c} °C" # je définis UN seul message : to_s end t = Temperature.new(21) puts t # 21 °C — puts a appelé t.to_s "il fait #{t}" # "il fait 21 °C" — l'interpolation aussi print t, "\n" # 21 °C — print aussi String(t) # "21 °C" # je n'ai jamais "branché" t sur puts : ils appellent to_s par convention
Tu écris un message ; le langage en a quatre qui l'appellent. Le protocole to_s n'est écrit nulle part — c'est une promesse tenue par convention.You write one message; the language has four that call it. The to_s protocol is written nowhere — it's a promise kept by convention.
« Réponds au message » — mais sache lesquels Ruby attend. Avant d'inventer ta propre méthode, demande-toi : existe-t-il un protocole implicite que ma classe pourrait remplir ?. Le bon hook (to_s, each, <=>) branche ton objet sur des dizaines de points d'appel gratuitement."Answer the message" — but know which Ruby expects. Before inventing your own method, ask: is there an implicit protocol my class could fulfill?. The right hook (to_s, each, <=>) wires your object into dozens of call sites for free.
Le № 1 a dit : on code contre un protocole, pas une classe. Restait la question : quels protocoles ? Ce numéro donne le catalogue tacite — les messages que la bibliothèque standard appelle sur tes objets sans te prévenir. Les connaître, c'est cesser de réinventer ce que Ruby t'offrait déjà.Issue № 1 said: code against a protocol, not a class. The question remained: which protocols? This issue gives the tacit catalog — the messages the standard library calls on your objects without warning. Knowing them means you stop reinventing what Ruby already offered.