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.

Numéros parusIssues out
32
En préparationIn the works
00
À venirForthcoming
00
Les rayonsThe shelves
09 vol.vol.
Par où commencer ? Diagnostic en 8 questions → Where to start? An 8-question diagnosis → Voir la carte des 32 numéros → See the map of all 32 issues →
Vol. I — Tout est objet, tout est messageAll objects, all messages À quel objet j'envoie ce message ?Which object am I messaging? · 03 numérosissues
DisponibleAvailable
Vol. 1 · №01 Déc 2025Dec 2025
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●○○○
ObjetMessageself
DisponibleAvailable
Vol. 1 · №02 Déc 2025Dec 2025
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●○○○
ObjetClassMétamodèle
DisponibleAvailable
Vol. 1 · №03 Jan 2026Jan 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●○○○
ObjetnilTradeoff
Vol. II — Les blocsBlocks Qui décide quand l'exécuter ?Who decides when to run it? · 03 numérosissues
DisponibleAvailable
Vol. 2 · №01 Jan 2026Jan 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
BlocyieldContrôle
DisponibleAvailable
Vol. 2 · №02 Jan 2026Jan 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
BlocProcLambda
DisponibleAvailable
Vol. 2 · №03 Jan 2026Jan 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
BlocClosureTradeoff
Vol. III — Le duck typingDuck typing Réponds-tu à ce message ?Do you respond to this message? · 04 numérosissues
DisponibleAvailable
Vol. 3 · №00 Jan 2026Jan 2026
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.

PubliéPublished ~ 3 chap.
LectureRead time ≈ 3 min
NiveauLevel ●○○○
Le filDuck typing
DisponibleAvailable
Vol. 3 · №01 Fév 2026Feb 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
Duck typingProtocolerespond_to?
DisponibleAvailable
Vol. 3 · №02 Fév 2026Feb 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
ProtocoleComparableEnumerable
DisponibleAvailable
Vol. 3 · №03 Fév 2026Feb 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 19 min
NiveauLevel ●●●○
Frontièredry-structSteep
Vol. IV — Mutabilité & identitéMutability & identity Une copie, ou le même objet ?A copy, or the same object? · 04 numérosissues
DisponibleAvailable
Vol. 4 · №00 Fév 2026Feb 2026
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.

PubliéPublished ~ 3 chap.
LectureRead time ≈ 3 min
NiveauLevel ●○○○
Le filMutabilité
DisponibleAvailable
Vol. 4 · №01 Mar 2026Mar 2026
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?

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
Aliasingobject_idMutabilité
DisponibleAvailable
Vol. 4 · №02 Mar 2026Mar 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
freezeImmutabilitéFrozenError
DisponibleAvailable
Vol. 4 · №03 Mar 2026Mar 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
dupcloneCopie profonde
Vol. V — Modules & mixinsModules & mixins Héritage, mixin ou composition ?Inherit, mix in, or compose? · 03 numérosissues
DisponibleAvailable
Vol. 5 · №01 Mar 2026Mar 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
ModuleMixinNamespace
DisponibleAvailable
Vol. 5 · №02 Avr 2026Apr 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 19 min
NiveauLevel ●●●○
Chaîne d'ancêtresprependsuper
DisponibleAvailable
Vol. 5 · №03 Avr 2026Apr 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●●○
extendCompositionForwardable
Vol. VI — La métaprogrammationMetaprogramming Générer, ou une méthode explicite ?Generate, or write it out? · 05 numérosissues
DisponibleAvailable
Vol. 6 · №00 Avr 2026Apr 2026
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.

PubliéPublished ~ 3 chap.
LectureRead time ≈ 3 min
NiveauLevel ●○○○
Le filMétaprogrammation
DisponibleAvailable
Vol. 6 · №01 Avr 2026Apr 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●●○
method_missingrespond_to_missing?Proxy
DisponibleAvailable
Vol. 6 · №02 Mai 2026May 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●●○
define_methodattr_accessorDSL
DisponibleAvailable
Vol. 6 · №03 Mai 2026May 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●●○
Classes ouvertesMonkey-patchrefinements
DisponibleAvailable
Vol. 6 · №04 Mai 2026May 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 21 min
NiveauLevel ●●●○
MethodMessageLate binding
Vol. VII — Les exceptionsExceptions Exceptionnel, ou flux normal ?Exceptional, or normal flow? · 03 numérosissues
DisponibleAvailable
Vol. 7 · №01 Mai 2026May 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
raiserescueensure
DisponibleAvailable
Vol. 7 · №02 Mai 2026May 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●●○
StandardErrorHiérarchieException
DisponibleAvailable
Vol. 7 · №03 Juin 2026Jun 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●●○
ResultfetchValeur de retour
Vol. VIII — Enumerable & l'itérationEnumerable & iteration Strict ou paresseux ?Strict or lazy? · 04 numérosissues
DisponibleAvailable
Vol. 8 · №00 Juin 2026Jun 2026
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.

PubliéPublished ~ 3 chap.
LectureRead time ≈ 3 min
NiveauLevel ●○○○
Le filEnumerable
DisponibleAvailable
Vol. 8 · №01 Juin 2026Jun 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
EnumerableeachMixin
DisponibleAvailable
Vol. 8 · №02 Juin 2026Jun 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
NiveauLevel ●●○○
mapreduceChaînage
DisponibleAvailable
Vol. 8 · №03 Juil 2026Jul 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 18 min
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? · 03 numérosissues
DisponibleAvailable
Vol. 9 · №01 Juil 2026Jul 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 19 min
NiveauLevel ●●●○
Résolution de méthodemethod cacheBenchmark
DisponibleAvailable
Vol. 9 · №02 Juil 2026Jul 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 19 min
NiveauLevel ●●●○
AllocationGCmemory_profiler
DisponibleAvailable
Vol. 9 · №03 Juil 2026Jul 2026
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.

PubliéPublished ~ 5 chap.
LectureRead time ≈ 19 min
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.