Question

Je branche souvent des lambdas préconfigurés dans des méthodes énumérables telles que "map", "select", etc. mais le comportement de "injecter" semble être différent. par exemple. avec

mult4 = lambda {|item| item * 4 }

puis

(5..10).map &mult4

me donne

[20, 24, 28, 32, 36, 40]

Cependant, si je fabrique un lambda à 2 paramètres à utiliser avec une injection similaire,

multL = lambda {|product, n| product * n }

Je veux pouvoir dire

(5..10).inject(2) &multL

puisque "inject" a un paramètre facultatif single pour la valeur initiale, mais ça me donne ...

irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
        from (irb):27:in `inject'
        from (irb):27

Cependant, si je mets le paramètre '& amp; multL' dans un paramètre seconde à injecter, cela fonctionne.

irb(main):028:0> (5..10).inject(2, &multL)
=> 302400

Ma question est "Pourquoi cela fonctionne-t-il et non la tentative précédente?"

Était-ce utile?

La solution

Donc, la raison pour laquelle

(5..10).map &mult4

fonctionne et

(5..10).inject(2) &multL

ne pas est que les parens de rubis sont implicites dans le premier cas, donc cela signifie vraiment

(5..10).map(&mult4)

si vous voulez, vous pouvez utiliser le second cas

(5..10).inject 2, &multL

L'astuce extérieure de parens ne fonctionne que pour passer des blocs à une méthode, pas des objets lambda.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top