Le Kiosque · Édition d'Apprentissage The Newsstand · Learning Edition

Une seule facette du modèle objet de Ruby,
disséquée jusqu'à l'os.
One facet of Ruby's object model,
dissected to the bone.

Une collection éditoriale pour le développeur qui vient d'un langage plus rigide et ne veut pas grinder les méthodes. Un numéro = un mécanisme-clé, disséqué jusqu'à ce que la tension soit nue : à quel objet on parle, ce que ça coûte, et quand ne pas dégainer la magie. On ne mémorise plus des incantations — on voit un message partir vers un objet qui décide. An editorial collection for the developer coming from a more rigid language who refuses to grind methods. One issue = one key mechanism, dissected until the tension is bare: which object you're talking to, what it costs, and when not to reach for the magic. You stop memorizing incantations — you watch a message travel to an object that decides.

Progression de lectureReading progress

Rien d'ouvert pour l'instantNothing opened yet

0 / 32 numéros lusissues read

0 / 152 chapitreschapters

CommencerStart Vol. 1 · № 01 self, le receveur, et l'envoi de messageself, the receiver, and the message send

Suivie dans ce navigateur, sans compte.Tracked in this browser, no account needed.

Libre, sans compte ni paywall — Free, no account, no paywall — soutenir sur Ko-fi ☕support it on Ko-fi ☕

Vol. I Tout est objet, tout est messageAll objects, all messages

À quel objet j'envoie ce message ?Which object am I messaging? · 3 numérosissues
Vol. 1 · Déc 2025Dec 2025 DisponibleAvailable
№01
self,
le receveur,
et l'envoi de message
self,
the receiver,
and the message send

Le code naïf croit que 1 + 2 est une opération câblée. En Ruby, c'est 1.+(2) — un message + envoyé à l'objet 1. Il n'y a pas de fonction libre, pas d'opérateur primitif : seulement des objets qui s'envoient des messages, et un receveur, fût-il implicite. Naive code thinks 1 + 2 is a wired-in operation. In Ruby it's 1.+(2) — a + message sent to the object 1. There are no free functions, no primitive operators: only objects sending each other messages, and a receiver, even an implicit one.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●○○○
ObjetMessageself
Vol. 1 · Déc 2025Dec 2025 DisponibleAvailable
№02
Tout est objet (vraiment tout) Everything is an object (truly everything)

Si tout appel est un message à un receveur, qui peut recevoir ? La réponse de Ruby n'a aucune exception : 42, nil, true, et les classes elles-mêmes. Integer est une instance de Class, et Class une instance de Class. Une règle, zéro cas particulier. If every call is a message to a receiver, who can receive? Ruby's answer has no exception: 42, nil, true, and the classes themselves. Integer is an instance of Class, and Class an instance of Class. One rule, zero special cases.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●○○○
ObjetClassMétamodèle
Vol. 1 · Jan 2026Jan 2026 DisponibleAvailable
№03
nil n'est pas null nil is not null

On traduit nil par null et on attend un crash de pointeur. Erreur : nil est l'unique instance de NilClass, un objet présent qui répond aux messages. Son NoMethodError n'est pas un segfault — c'est un receveur qui décline un message qu'il ne connaît pas. Remonte à la source du nil. We translate nil as null and brace for a pointer crash. Wrong: nil is the sole instance of NilClass, a present object that answers messages. Its NoMethodError isn't a segfault — it's a receiver declining a message it doesn't know. Trace back to the source of the nil.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●○○○
ObjetnilTradeoff

Vol. II Les blocsBlocks

Qui décide quand l'exécuter ?Who decides when to run it? · 3 numérosissues
Vol. 2 · Jan 2026Jan 2026 DisponibleAvailable
№01
Blocks & yield,
ou le contrôle qu'on délègue
Blocks & yield,
or the control you delegate

On lit each { |n| … } comme « la boucle de Ruby ». C'est tout rater. each est une méthode ; le bloc est un morceau de code qu'on lui confie ; et c'est elle qui le rappelle, via yield, quand et autant de fois qu'elle veut. Tu fournis le quoi, la méthode garde le comment. We read each { |n| … } as 'Ruby's loop'. That misses everything. each is a method; the block is a piece of code you hand it; and it calls back, via yield, when and as often as it likes. You supply the what, the method keeps the how.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
BlocyieldContrôle
Vol. 2 · Jan 2026Jan 2026 DisponibleAvailable
№02
Proc vs Lambda,
ou la fonction et le fragment
Proc vs Lambda,
the function and the fragment

Capturer un bloc dans un objet donne un proc ou une lambda. Même classe Proc, même .call — et deux comportements opposés : la lambda exige la bonne arité et son return est local ; le proc s'arrange de tout et son return sort de la méthode englobante. Une fonction, ou un fragment ? Choisis. Capturing a block in an object gives a proc or a lambda. Same Proc class, same .call — and two opposite behaviors: the lambda demands the right arity and its return is local; the proc shrugs everything off and its return exits the enclosing method. A function, or a fragment? Choose.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
BlocProcLambda
Vol. 2 · Jan 2026Jan 2026 DisponibleAvailable
№03
Closures & la capture du contexte Closures & capturing the context

Un bloc n'emporte pas que du code : il emporte les variables qui l'entouraient à sa naissance — la variable vivante, pas une copie figée. C'est ce qui fait les compteurs et les caches, et ce qui piège quand plusieurs closures partagent la même variable de boucle. A block carries more than code: it carries the variables that surrounded it at birth — the live variable, not a frozen copy. That's what makes counters and caches, and what traps you when several closures share one loop variable.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
BlocClosureTradeoff

Vol. III Le duck typingDuck typing

Réponds-tu à ce message ?Do you respond to this message? · 4 numérosissues
Vol. 3 · Jan 2026Jan 2026 DisponibleAvailable
№00
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.

LectureRead time ≈ 3 min · 3 chap.
NiveauLevel ●○○○
Le filDuck typing
Vol. 3 · Fév 2026Feb 2026 DisponibleAvailable
№01
Le duck typing,
ou réponds-tu au message ?
Duck typing,
or do you answer the message?

Une méthode qui appelle x.quack fonctionne sur n'importe quel objet répondant à quack — sans interface à implémenter, sans superclasse commune. Le seul contrat, c'est le message. On ne demande pas quel type tu es : on demande si tu réponds. A method calling x.quack works on any object that responds to quack — no interface to implement, no shared superclass. The only contract is the message. We don't ask what type you are: we ask whether you respond.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
Duck typingProtocolerespond_to?
Vol. 3 · Fév 2026Feb 2026 DisponibleAvailable
№02
Les protocoles implicites Implicit protocols

Le duck typing dit « réponds au message » — mais lesquels ? Ruby en attend certains sans jamais les déclarer : to_s, <=>, each, hash. Fournis le bon hook et inclus le mixin, et tu obtiens des familles entières de méthodes. Une « interface » que personne n'a écrite, et un marché : un hook contre une famille. Duck typing says 'answer the message' — but which? Ruby expects some without ever declaring them: to_s, <=>, each, hash. Provide the right hook, include the mixin, and you get whole method families. An 'interface' nobody wrote, and a bargain: one hook for a family.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
ProtocoleComparableEnumerable
Vol. 3 · Fév 2026Feb 2026 DisponibleAvailable
№03
Quand le canard trahit — frontières & types optionnels When the duck betrays you — boundaries & optional types

Le duck typing déplace l'erreur à l'exécution, loin de sa cause : le NoMethodError au pire endroit. La parade n'est pas de tout vérifier, mais de regagner une garantie à la frontière — au runtime sur la donnée (dry-struct), ou à l'analyse sur le code (Steep, RBS). Une frontière, deux façons de la tenir. Duck typing pushes the error to runtime, far from its cause: the NoMethodError at the worst place. The remedy isn't to check everything, but to regain a guarantee at the boundary — at runtime on the data (dry-struct), or at analysis on the code (Steep, RBS). One boundary, two ways to hold it.

LectureRead time ≈ 19 min · 5 chap.
NiveauLevel ●●●○
Frontièredry-structSteep

Vol. IV Mutabilité & identitéMutability & identity

Une copie, ou le même objet ?A copy, or the same object? · 4 numérosissues
Vol. 4 · Fév 2026Feb 2026 DisponibleAvailable
№00
Le fil du Vol 4,
ou tout opère en surface
The thread of Vol 4,
or everything works at the surface

Avant les trois numéros, le pourquoi. En Ruby, a = b ne copie rien : l'objet est partagé. Les trois numéros répondent à une question — qui partage quoi — avec une même limite : chaque geste s'arrête au premier niveau. Nommer le danger, geler pour neutraliser, copier pour isoler — et freeze comme dup ne couvrent qu'une couche. Before the three issues, the why. In Ruby, a = b copies nothing: the object is shared. The three issues answer one question — who shares what — with one same limit: each move stops at the first level. Name the danger, freeze to neutralize, copy to isolate — and freeze like dup cover one layer only.

LectureRead time ≈ 3 min · 3 chap.
NiveauLevel ●○○○
Le filMutabilité
Vol. 4 · Mar 2026Mar 2026 DisponibleAvailable
№01
Référence partagée,
ou a = b ne copie rien
Shared reference,
or a = b copies nothing

En Ruby, a = b ne copie pas l'objet : les deux noms désignent le même. Muter par l'un (<<, gsub!) se voit par l'autre — d'où le tableau « local » qu'un appelant retrouve modifié à distance. Le réflexe : avant de muter, qui d'autre tient ce même objet ? In Ruby, a = b doesn't copy the object: both names point at the same one. Mutating through one (<<, gsub!) shows through the other — hence the 'local' array a caller finds modified at a distance. The reflex: before mutating, who else holds this same object?

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
Aliasingobject_idMutabilité
Vol. 4 · Mar 2026Mar 2026 DisponibleAvailable
№02
freeze,
ou rendre la mutation impossible
freeze,
or making mutation impossible

Si l'objet partagé est le danger du № 1, freeze en est la parade : un objet gelé refuse toute mutation par un FrozenError franc, donc se partage sans risque. Deux réserves — le gel est définitif, et superficiel : il ne gèle qu'un seul niveau. If the shared object is № 1's danger, freeze is its remedy: a frozen object refuses every mutation with a plain FrozenError, so it shares without risk. Two caveats — freezing is permanent, and shallow: it freezes one level only.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
freezeImmutabilitéFrozenError
Vol. 4 · Mar 2026Mar 2026 DisponibleAvailable
№03
dup vs clone,
ou la copie qui ne descend pas
dup vs clone,
or the copy that doesn't go deep

Copier un objet ne copie pas son contenu imbriqué : dup et clone ne dupliquent qu'un niveau, les sous-objets restent partagés. Le réflexe : ma copie est-elle assez profonde pour ce que je vais en faire ? Et le piège du Marshal « pour être sûr ». Copying an object doesn't copy its nested contents: dup and clone duplicate one level only, the sub-objects stay shared. The reflex: is my copy deep enough for what I'm about to do? And the Marshal 'just to be sure' trap.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
dupcloneCopie profonde

Vol. V Modules & mixinsModules & mixins

Héritage, mixin ou composition ?Inherit, mix in, or compose? · 3 numérosissues
Vol. 5 · Mar 2026Mar 2026 DisponibleAvailable
№01
Modules,
ou un seul mot pour deux outils
Modules,
or one word for two tools

Un module fait deux métiers : ranger (espace de noms accédé par ::) et partager (mixin injecté par include). Le verbe trahit l'intention. Le piège : mixer tout un module là où l'on voulait juste nommer une constante. A module does two jobs: organizing (a namespace reached via ::) and sharing (a mixin injected via include). The verb betrays the intention. The trap: mixing a whole module where you only wanted to name a constant.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
ModuleMixinNamespace
Vol. 5 · Avr 2026Apr 2026 DisponibleAvailable
№02
La chaîne d'ancêtres,
ou où Ruby cherche la méthode
The ancestor chain,
or where Ruby looks for the method

Résoudre un message, c'est parcourir ancestors jusqu'au premier ancêtre qui répond. include insère le module sous la classe, prepend au-dessus (pour envelopper), super appelle le maillon suivant. Le diamant n'existe pas : la chaîne est une liste linéarisée et lisible. Resolving a message is walking ancestors to the first ancestor that answers. include inserts the module below the class, prepend above (to wrap), super calls the next link. The diamond doesn't exist: the chain is a linearized, readable list.

LectureRead time ≈ 19 min · 5 chap.
NiveauLevel ●●●○
Chaîne d'ancêtresprependsuper
Vol. 5 · Avr 2026Apr 2026 DisponibleAvailable
№03
extend & composition,
ou être plutôt que savoir faire
extend & composition,
or being versus knowing how

extend mixe au niveau d'un objet : dans une classe, des méthodes de classe ; sur une instance, un décorateur. Et quand on ne veut ni être ni mixer, la composition délègue (has-a, Forwardable). Le piège : sous-classer un conteneur pour trois méthodes et en hériter cent. extend mixes at the object level: in a class, class methods; on an instance, a decorator. And when you want neither to be nor to mix, composition delegates (has-a, Forwardable). The trap: subclassing a container for three methods and inheriting a hundred.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
extendCompositionForwardable

Vol. VI La métaprogrammationMetaprogramming

Générer, ou une méthode explicite ?Generate, or write it out? · 5 numérosissues
Vol. 6 · Avr 2026Apr 2026 DisponibleAvailable
№00
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.

LectureRead time ≈ 3 min · 3 chap.
NiveauLevel ●○○○
Le filMétaprogrammation
Vol. 6 · Avr 2026Apr 2026 DisponibleAvailable
№01
method_missing,
ou répondre à ce qu'on n'a pas écrit
method_missing,
or answering what you never wrote

Au bout de la chaîne d'ancêtres, quand rien n'a répondu, Ruby appelle method_missing. Le redéfinir intercepte les messages inconnus — mais jamais sans son jumeau respond_to_missing?, sinon l'objet ment au duck typing. Et seulement pour un ensemble ouvert : le connu se génère. At the end of the ancestor chain, when nothing answered, Ruby calls method_missing. Redefining it intercepts unknown messages — but never without its twin respond_to_missing?, or the object lies to duck typing. And only for an open set: the known is generated.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
method_missingrespond_to_missing?Proxy
Vol. 6 · Mai 2026May 2026 DisponibleAvailable
№02
define_method,
ou la magie qu'on peut retrouver
define_method,
or the magic you can find again

define_method crée de vraies méthodes à partir d'un nom calculé : listées, vues par respond_to?, trouvées par grep — l'inverse de l'interception. attr_accessor n'est que cette boucle. Le réflexe : générer si les noms sont des données ou nombreux ; sinon, def gagne. define_method creates real methods from a computed name: listed, seen by respond_to?, found by grep — the opposite of interception. attr_accessor is just that loop. The reflex: generate if names are data or many; otherwise, def wins.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
define_methodattr_accessorDSL
Vol. 6 · Mai 2026May 2026 DisponibleAvailable
№03
Classes ouvertes,
ou le monkey-patch et sa portée
Open classes,
or monkey-patching and its scope

Une classe Ruby n'est jamais fermée : on rouvre n'importe laquelle, même String. Mais il n'en existe qu'une — la rouvrir agit à distance, sur tout le programme. Le réflexe : ce patch doit-il être visible partout (monkey-patch), ou seulement dans mon fichier (refinement) ? Souvent, pas de patch du tout. A Ruby class is never closed: you reopen any of them, even String. But there's only one — reopening it acts at a distance, on the whole program. The reflex: must this patch be visible everywhere (monkey-patch), or only in my file (refinement)? Often, no patch at all.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
Classes ouvertesMonkey-patchrefinements
Vol. 6 · Mai 2026May 2026 DisponibleAvailable
№04
L'objet Method,
ou pourquoi on ne le passe pas
The Method object,
and why you don't pass it

Définir une méthode ne donne aucune valeur à transporter : il faut la demander, obj.method(:m), pour obtenir un objet Method appelable comme une lambda. Mais ce handle est un instantané — il fige l'implémentation au moment de la capture. Envoyer le message, lui, ré-résout à chaque appel. Toute la différence entre une méthode et un message tient là. Defining a method gives you no value to carry: you have to ask for it, obj.method(:m), to get a Method object callable like a lambda. But that handle is a snapshot — it freezes the implementation at capture time. Sending the message instead re-resolves on every call. The whole difference between a method and a message lives there.

LectureRead time ≈ 21 min · 5 chap.
NiveauLevel ●●●○
MethodMessageLate binding

Vol. VII Les exceptionsExceptions

Exceptionnel, ou flux normal ?Exceptional, or normal flow? · 3 numérosissues
Vol. 7 · Mai 2026May 2026 DisponibleAvailable
№01
raise / rescue / ensure,
ou l'erreur est un objet
raise / rescue / ensure,
or the error is an object

Une exception est un objet levé par raise, qui déroule la pile jusqu'à un rescue du bon type. rescue trie par classe (un rescue nu en attrape trop) ; ensure garantit le nettoyage sans rien avaler. Trois mots, trois rôles : signaler, rattraper, nettoyer — qu'on ne mélange jamais. An exception is an object raised by raise, unwinding the stack to a rescue of the right type. rescue sorts by class (a bare rescue catches too much); ensure guarantees cleanup without swallowing. Three words, three roles: signal, catch, clean up — never to be mixed.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
raiserescueensure
Vol. 7 · Mai 2026May 2026 DisponibleAvailable
№02
Concevoir sa hiérarchie,
ou StandardError jamais Exception
Designing your hierarchy,
or StandardError never Exception

Les exceptions forment un arbre où une frontière commande tout : StandardError (le rattrapable, et tes erreurs) sous Exception (qui contient aussi les signaux). Hérite de StandardError, rattrape StandardError, jamais Exception — sinon on avale le Ctrl-C. Et bannis le rescue fourre-tout qui rend nil. Exceptions form a tree where one boundary commands everything: StandardError (the rescuable, and your errors) under Exception (which also holds the signals). Inherit from StandardError, rescue StandardError, never Exception — or you swallow Ctrl-C. And ban the catch-all rescue that returns nil.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
StandardErrorHiérarchieException
Vol. 7 · Juin 2026Jun 2026 DisponibleAvailable
№03
Exceptions vs valeurs de retour,
ou quand ne pas lever
Exceptions vs return values,
or when not to raise

Une exception déroule la pile, construit une stack trace et détourne le flux — justifié pour l'imprévu, gaspillé pour l'attendu. Pour une absence ou un échec prévu : rends une valeur (nil, Result, fetch avec défaut). Le signal infaillible : si tu rattrapes l'exception là où tu la lèves, c'est un if déguisé. An exception unwinds the stack, builds a trace and diverts the flow — justified for the unforeseen, wasted on the expected. For an absence or an expected failure: return a value (nil, Result, fetch with a default). The infallible signal: if you rescue the exception where you raise it, it's a disguised if.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
ResultfetchValeur de retour

Vol. VIII Enumerable & l'itérationEnumerable & iteration

Strict ou paresseux ?Strict or lazy? · 4 numérosissues
Vol. 8 · Juin 2026Jun 2026 DisponibleAvailable
№00
Le fil du Vol 8,
ou fonder,
composer,
raffiner
The thread of Vol 8,
or found,
compose,
refine

Avant les trois numéros, le pourquoi. map, select, reduce ne sont pas des fonctions de liste mais des messages d'Enumerable, débloqués par un seul each (Vol 2). Le volume se bâtit : fonder (each débloque 50 méthodes) → composer (chaîner les transformations) → raffiner (différer avec lazy). Chacun repose sur celui d'en dessous. Before the three issues, the why. map, select, reduce aren't list functions but Enumerable messages, unlocked by a single each (Vol 2). The volume builds upward: found (each unlocks 50 methods) → compose (chain transformations) → refine (defer with lazy). Each rests on the one below.

LectureRead time ≈ 3 min · 3 chap.
NiveauLevel ●○○○
Le filEnumerable
Vol. 8 · Juin 2026Jun 2026 DisponibleAvailable
№01
Enumerable via each,
ou le contrat minimal
Enumerable via each,
or the minimal contract

Implémente un seul each qui yielde tes éléments, include Enumerable, et tu hérites map, select, reduce, sort, group_by — une cinquantaine de méthodes, sur n'importe quelle structure. Le mixin appelle ton each, il n'a aucune autre source. Le piège : réécrire ces méthodes une par une. Implement a single each that yields your elements, include Enumerable, and you inherit map, select, reduce, sort, group_by — some fifty methods, on any structure. The mixin calls your each, it has no other source. The trap: rewriting these methods one by one.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
EnumerableeachMixin
Vol. 8 · Juin 2026Jun 2026 DisponibleAvailable
№02
map / select / reduce,
ou penser en transformations
map / select / reduce,
or thinking in transformations

Une boucle qui accumule cache son intention dans la mécanique ; une chaîne la nomme étape par étape. map transforme, select filtre, reduce replie, each_with_object bâtit. Le piège du style : chaîner pour chaîner — si tu jettes un map, tu voulais each ; si un mot suffit (find, tally), écris-le. A loop that accumulates hides its intent in machinery; a chain names it step by step. map transforms, select filters, reduce folds, each_with_object builds. The style's trap: chaining for its own sake — discard a map and you wanted each; if one word fits (find, tally), write it.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●○○
mapreduceChaînage
Vol. 8 · Juil 2026Jul 2026 DisponibleAvailable
№03
lazy & les Enumerator,
ou le calcul tiré par la demande
lazy & Enumerators,
or computation pulled by demand

Une chaîne stricte matérialise un Array à chaque maillon ; lazy diffère et fait descendre les éléments un à un, ne produisant que ce qu'on demande — d'où l'infini calculable. Sous lazy, l'Enumerator (next, peek, Enumerator.new). Le piège : lazy sur dix éléments, où l'overhead dépasse le gain. A strict chain materializes an Array at every link; lazy defers and sends elements down one by one, producing only what's asked — hence computable infinity. Beneath lazy, the Enumerator (next, peek, Enumerator.new). The trap: lazy on ten elements, where overhead beats the gain.

LectureRead time ≈ 18 min · 5 chap.
NiveauLevel ●●●○
lazyEnumeratorSéquences infinies

Vol. IX Le coût du dynamismeThe cost of dynamism

Connais-tu le coût, ou l'imagines-tu ?Do you know the cost, or guess it? · 3 numérosissues
Vol. 9 · Juil 2026Jul 2026 DisponibleAvailable
№01
La résolution de méthode,
ou le coût que le cache amortit
Method resolution,
or the cost the cache amortizes

Chaque message se résout en remontant la chaîne d'ancêtres (Vol 5), mais Ruby met le résultat en cache : la profondeur ne se paie qu'au premier appel. Le coût ne reparaît qu'hors du cache — method_missing, ou la modification de classes en boucle. La règle : mesure avant de croire, jamais l'inverse. Every message resolves by walking the ancestor chain (Vol 5), but Ruby caches the result: depth is paid only on the first call. The cost reappears only outside the cache — method_missing, or modifying classes in a loop. The rule: measure before believing, never the reverse.

LectureRead time ≈ 19 min · 5 chap.
NiveauLevel ●●●○
Résolution de méthodemethod cacheBenchmark
Vol. 9 · Juil 2026Jul 2026 DisponibleAvailable
№02
Allocations cachées & le GC,
ou compter plutôt que craindre
Hidden allocations & the GC,
or counting rather than fearing

Chaque littéral "…"/[]/{} alloue un objet, et le GC paie pour le libérer. Le coût n'est pas dans le littéral isolé mais dans sa fréquence : un objet par tour de boucle chaude pèse, le même sur un chemin froid non. On ne le lit pas — on le compte (GC.stat, ObjectSpace, memory_profiler). Le piège : geler à l'aveugle. Every literal "…"/[]/{} allocates an object, and the GC pays to free it. The cost isn't in the lone literal but in its frequency: one object per hot-loop turn weighs, the same on a cold path doesn't. You don't read it — you count it (GC.stat, ObjectSpace, memory_profiler). The trap: freezing blindly.

LectureRead time ≈ 19 min · 5 chap.
NiveauLevel ●●●○
AllocationGCmemory_profiler
Vol. 9 · Juil 2026Jul 2026 DisponibleAvailable
№03
Concurrence & le GVL,
ou attente contre calcul
Concurrency & the GVL,
or waiting versus computing

En MRI, le GVL n'autorise qu'un thread Ruby à la fois : les threads ne parallélisent pas le calcul, mais chevauchent l'attente (le GVL se libère pendant l'I/O). La question avant tout : mon goulot est-il de l'attente (threads, async) ou du calcul (Ractors, processus) ? Le piège : des threads sur du CPU, sans avoir mesuré. In MRI, the GVL allows only one Ruby thread at a time: threads don't parallelize computation, but overlap waiting (the GVL releases during I/O). The question before all: is my bottleneck waiting (threads, async) or computing (Ractors, processes)? The trap: threads on CPU, without having measured.

LectureRead time ≈ 19 min · 5 chap.
NiveauLevel ●●●○
GVLRactorConcurrence
Mot de l'éditeurFrom the editor

Pas des méthodes. Un modèle. Not methods. A model.

Le piège, en apprenant Ruby, c'est de collectionner des incantations — de retenir la méthode magique qui « marche » sans voir le seul mécanisme qui les explique toutes : tout est un objet, et tout calcul est l'envoi d'un message. Chaque numéro dissèque une seule facette : le receveur, le bloc, le type-canard, le mixin, la méta, le coût. À quel objet on parle d'abord, le prix ensuite, et le contre-exemple — quand ne pas l'employer. The trap, learning Ruby, is collecting incantations — memorizing the magic method that 'works' without seeing the one mechanism that explains them all: everything is an object, and every computation is a message send. Each issue dissects a single facet: the receiver, the block, the duck type, the mixin, the meta, the cost. Which object you're talking to first, the price next, and the counter-example — when not to use it.

La règle tacite : en Ruby, on ne demande pas de quel type est une chose — on lui envoie un message et on regarde si elle y répond. Il n'y a pas de compilateur qui prouve ; il y a un objet qui reçoit. Toute la puissance de Ruby découle de cette règle — et tous ses pièges aussi. The unspoken rule: in Ruby, you don't ask what type a thing is — you send it a message and see if it responds. There's no compiler proving anything; there's an object receiving. All of Ruby's power flows from this rule — and so do all its traps.