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

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.

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
Juin 2026 Jun 2026
≈ 3 min ●○○○ Le filEnumerable
SommaireContents ·
№ —La tensionThe tension1 min

map, select, reduce ne sont pas des fonctions — ce sont des messages.map, select, reduce aren't functions — they're messages.

Ce frontispice n'enseigne pas un mécanisme : il dit le fil qui relie les trois numéros du volume. Le réflexe fonctionnel de Ruby — map, select, reduce — ressemble à une boîte à outils de fonctions de liste. Il n'en est rien : ce sont des messages du module Enumerable, et tous reposent sur une seule méthode que tu fournis, each. Le volume récolte le fruit du Vol 2 (les blocs) : each est une méthode à qui on confie un bloc, rappelé une fois par élément. De cette unique fondation, tout se construit — puis se raffine.This frontispiece teaches no mechanism: it states the thread linking the volume's three issues. Ruby's functional reflex — map, select, reduce — looks like a toolbox of list functions. It isn't: they're messages of the Enumerable module, and all rest on a single method you provide, each. The volume reaps Vol 2's fruit (blocks): each is a method you hand a block, called once per element. From that one foundation, everything is built — then refined.

Le réflexe du volume : je décris une transformation de collection — stricte ou paresseuse, et quels objets intermédiaires j'alloue ?The volume's reflex: I describe a collection transformation — strict or lazy, and which intermediate objects do I allocate?
№ —Le filThe thread1 min

Une fondation, un style, un raffinement.A foundation, a style, a refinement.

Les trois numéros se bâtissent l'un sur l'autre. Le № 1 pose la fondation : écris un seul each, include Enumerable, et tu hérites cinquante méthodes — map, select, reduce, sort, min, group_by — gratuitement. Le № 2 est le style : penser en transformations chaînées — map puis select puis reduce — plutôt qu'en accumulation impérative dans une boucle. Le № 3 est le raffinement : ces chaînes allouent un tableau intermédiaire à chaque étape ; lazy diffère le calcul, compose sur des séquences infinies, et ne calcule que ce qu'on demande. Fondation, style, raffinement — chacun repose sur celui d'en dessous.The three issues build on one another. № 1 lays the foundation: write a single each, include Enumerable, and you inherit fifty methods — map, select, reduce, sort, min, group_by — for free. № 2 is the style: thinking in chained transformations — map then select then reduce — rather than imperative accumulation in a loop. № 3 is the refinement: those chains allocate an intermediate array at each step; lazy defers the work, composes over infinite sequences, and computes only what's asked. Foundation, style, refinement — each rests on the one below.

Ce qu'on bâtit sur un seul eachWhat you build on a single each
№ 3RaffinerRefinelazy, Enumeratordifférer, séquences infiniesdefer, infinite sequences
№ 2ComposerComposemap · select · reducechaîner les transformationschain transformations
№ 1FonderFoundeach + include Enumerableun contrat, 50 méthodesone contract, 50 methods

On ne monte pas d'un cran sans le précédent : pas de map chaîné sans each, pas de lazy utile sans chaîne à différer. Écris la fondation, compose le style, raffine si le profil le réclame.You don't climb a rung without the previous: no chained map without each, no useful lazy without a chain to defer. Write the foundation, compose the style, refine if the profile calls for it.

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

Fonder, composer, raffiner — et le contre-exemple à chaque fois.Found, compose, refine — and the counter-example each time.

№Le mécanismeThe mechanismCe qu'il installeWhat it installs
1Enumerable via each — fonderEnumerable via each — foundUn seul each, include Enumerable, et 50 méthodes arrivent. Le contre-exemple : réimplémenter map/select à la main.One each, include Enumerable, and 50 methods arrive. The counter-example: reimplementing map/select by hand.
2map/select/reduce — composermap/select/reduce — composePenser en transformations chaînées, pas en boucles. Le contre-exemple : la boucle impérative qui accumule à la main.Think in chained transformations, not loops. The counter-example: the imperative loop accumulating by hand.
3lazy & Enumerator — raffinerlazy & Enumerator — refineDifférer le calcul, éviter les tableaux intermédiaires. Le contre-exemple : lazy sur 10 éléments, où l'overhead coûte plus que le gain.Defer the work, avoid intermediate arrays. The counter-example: lazy on 10 elements, where the overhead costs more than the gain.
Écris each, et tu obtiens un langage de transformations. Compose-le, puis ne le raffine qu'avec un profil.Write each, and you get a language of transformations. Compose it, then refine it only with a profile.