2008-09-19 19 views
5

Je branche souvent des lambdas préconfigurés dans des méthodes énumérables comme 'map', 'select' etc. mais le comportement de 'injection' semble être différent. par exemple. avecComprendre le comportement d'injection utilisé avec un lambda dans Ruby

mult4 = lambda {|item| item * 4 } 

puis

(5..10).map &mult4 

me donne

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

Cependant, si je fais un 2 paramètres lambda pour une utilisation avec une injection comme si,

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

Je veux être capable de dire

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

depuis 'inject' a une option seul paramètre pour la valeur initiale, mais qui 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 Farcir le '& multL' dans un deuxième paramètre à injecter, puis cela fonctionne. Ma question est "pourquoi est-ce que cela fonctionne et pas la tentative précédente?"

Répondre

10

donc la raison pour laquelle

(5..10).map &mult4 

œuvres et

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

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

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

si vous vouliez, pour le deuxième cas vous pourriez utiliser

L'astuce de l'action parens ne fonctionne que pour le passage de blocs à une méthode, pas pour des objets lambda.