5 Stimmen

Das Verhalten von inject in Verbindung mit einem Lambda in Ruby verstehen

Ich stecke oft vorkonfigurierte Lambdas in aufzählbare Methoden wie 'map', 'select' usw. aber das Verhalten von 'inject' scheint anders zu sein. z.B. mit

mult4 = lambda {|item| item * 4 }

dann

(5..10).map &mult4

gibt mir

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

Wenn ich jedoch ein 2-Parameter-Lambda für die Verwendung mit einem Injektionsmittel wie folgt erstelle,

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

Ich möchte in der Lage sein zu sagen

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

da 'inject' eine optionale einzeln Parameter für den Anfangswert, aber das gibt mir ...

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

Wenn ich jedoch das '&multL' in eine zweite Parameter zu injizieren, dann funktioniert es.

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

Meine Frage lautet: "Warum funktioniert das und nicht der vorherige Versuch?"

11voto

rampion Punkte 84270

Der Grund dafür ist also, dass

(5..10).map &mult4

arbeitet und

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

ist, dass Ruby Parens im ersten Fall implizit sind, so dass es wirklich bedeutet

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

wenn Sie wollen, können Sie für den zweiten Fall

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

Der Trick mit der Übergabe außerhalb der Parens funktioniert nur bei der Übergabe von Blöcken an eine Methode, nicht bei Lambda-Objekten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X