Écris un seul each — et hérite cinquante méthodes.Write a single each — and inherit fifty methods.
Le Vol 8 récolte le fruit du Vol 2. each n'est pas « la boucle de Ruby » : c'est une méthode à qui on confie un bloc, rappelé une fois par élément. Et c'est exactement le contrat que réclame le module Enumerable — un seul. include Enumerable dans ta classe, définis each en yieldant tes éléments, et tu reçois d'un coup map, select, reduce, sort, min_by, group_by, find, take_while… une cinquantaine de méthodes, toutes construites sur ton each. Tu n'écris pas une bibliothèque de collection : tu déclares comment parcourir, et Enumerable fait le reste.Vol 8 reaps Vol 2's fruit. each isn't 'Ruby's loop': it's a method you hand a block, called once per element. And that's exactly the contract the Enumerable module asks for — just one. include Enumerable in your class, define each by yielding your elements, and you get at once map, select, reduce, sort, min_by, group_by, find, take_while… some fifty methods, all built on your each. You don't write a collection library: you declare how to traverse, and Enumerable does the rest.
class Playlist include Enumerable # le mixin (Vol 5) — il s'appuie sur each def initialize(songs) = @songs = songs def each(&block) # LE seul contrat à fournir : yield chaque élément @songs.each(&block) end end list = Playlist.new(songs) list.map(&:title) # gratuit list.select(&:fav?) # gratuit list.min_by(&:duration) # gratuit list.group_by(&:genre) # gratuit — aucune n'a été écrite à la main
Toutes les méthodes d'Enumerable n'ont besoin que d'une chose : pouvoir parcourir. Elles appellent ton each en interne. Fournis le parcours, hérite les transformations — c'est le meilleur rapport effort/pouvoir de tout Ruby.Every Enumerable method needs only one thing: to be able to traverse. They call your each internally. Provide the traversal, inherit the transformations — the best effort/power ratio in all of Ruby.
« Ma classe-collection a-t-elle un each idiomatique, ou je réinvente map à la main ? » Dès qu'un objet contient ou produit plusieurs éléments, donne-lui un each et include Enumerable — au lieu d'écrire, une par une, des méthodes que le mixin offrait déjà."Does my collection class have an idiomatic each, or am I reinventing map by hand?" The moment an object holds or produces several elements, give it an each and include Enumerable — instead of writing, one by one, methods the mixin already offered.
Le Vol 2 a montré qu'each est une méthode qui rappelle un bloc. Le voici récompensé : ce même each, écrit une fois, est la clé de tout Enumerable. Et c'est le même mécanisme qu'au Vol 5 — include Enumerable insère le module dans ta chaîne d'ancêtres, ses méthodes deviennent les tiennes. Rien de neuf : juste deux briques des volumes précédents qui s'emboîtent.Vol 2 showed each is a method that calls a block back. Here it's rewarded: that same each, written once, is the key to all of Enumerable. And it's the same mechanism as Vol 5 — include Enumerable inserts the module into your ancestor chain, its methods become yours. Nothing new: just two bricks from earlier volumes clicking together.