Un bloc qu'on garde sous la main devient un objet qu'on rappelle.A block you keep around becomes an object you call back.
Au numéro précédent, le bloc partait avec l'appel et la méthode le rappelait via yield. Mais on peut aussi le capturer dans un objet : une lambda (->) ou un proc. Cet objet se range dans une variable, se passe en argument, se rappelle plus tard avec .call. Deux façons de l'écrire, qui semblent interchangeables — et qui, on va le voir, ne le sont pas du tout.Last issue, the block left with the call and the method called it back via yield. But you can also capture it in an object: a lambda (->) or a proc. That object goes into a variable, gets passed as an argument, gets called later with .call. Two ways to write it, seemingly interchangeable — and, as we'll see, not at all.
add = ->(a, b) { a + b } # une lambda : un bloc capturé dans un objet
add.call(1, 2) # => 3 — la forme explicite
add.(1, 2) # => 3 — le sucre .()
add[1, 2] # => 3 — et même []
square = proc { |x| x * x } # un proc : l'autre objet-fonction
square.call(5) # => 25
add.class # => Proc — les deux sont des Proc
add.lambda? # => true — mais celui-ci se sait lambdaLes deux ont pour classe Proc. La différence n'est pas de type — elle est de comportement, et elle ne se voit qu'à l'appel.Both have class Proc. The difference isn't of type — it's of behavior, and it only shows at call time.
« Ce comportement, je le passe en bloc — mais ici je le garde dans un objet. » La question devient : ai-je besoin d'une vraie petite fonction (stricte, autonome) ou d'un simple fragment de code souple ? Le choix lambda / proc répond exactement à ça — et se paie si on se trompe."This behavior, I pass it as a block — but here I keep it in an object." The question becomes: do I need a genuine little function (strict, self-contained) or just a loose code fragment? The lambda / proc choice answers exactly that — and costs you if you get it wrong.
On boucle sur le Vol 1 : un morceau de comportement est, lui aussi, un objet. On l'assigne, on le passe, on lui envoie le message .call. Ce n'est pas une construction à part du langage — c'est une instance de Proc, avec une classe et des méthodes comme tout le reste.We loop back to Vol 1: a piece of behavior is, too, an object. You assign it, pass it, send it the .call message. It's not a separate language construct — it's an instance of Proc, with a class and methods like everything else.