2016-04-09 3 views
-1

Wenn ich versuche, einen beliebigen Block each_with_object Methode zu übergeben, wirft er einen Fehler:eine proc als Block auf ein Verfahren Passing

%w(foo bar baz).each_with_object([]) &->(i,m) { m << i.upcase } 
# => NoMethodError: undefined method `&' for #<Enumerator: ["foo", "bar", "baz"]:each_with_object([])> 

Wenn ich versuche, um einen Block zu inject Methode zu übergeben, ist es auch erhöhen ein Fehler:

%w(foo bar baz).inject('') &->(m,i) { m + i.upcase } 
# => NoMethodError: undefined method `' for "foo":String 

Aber es funktioniert, wenn ich nicht einen Anfangswert übergeben:

%w(foo bar baz).split.inject &->(m,i) { m + i.upcase } 

Und es funktioniert auch, wenn ich einen Block an each Methode übergeben.

%w(foo bar baz).each &->(i) { puts i.upcase } 
# FOO 
# BAR 
# BAZ 

Kann jemand dieses Verhalten erklären? Wie kann ich willkürliche Blöcke an die ersten beiden Beispiele übergeben?

+0

Was hat das mit der Code :: Blocks C++ IDE zu tun? –

+0

@ JörgWMittag Leider habe ich dieses Tag versehentlich hinzugefügt. – sawa

Antwort

4

Das Argument & Argument verwandelt ein Argument in den Block der Methode (durch Aufruf von to_proc darauf). Da es ein Argument ist, muss es in den Pars gehen, wenn Sie sie verwenden, dh

%w(foo bar baz).each_with_object([], &->(i,m) { m << i.upcase }) 

Im Moment interpretiert Rubin die & als binärer Operator, und versuchen zu tun:

(%w(foo bar baz).each_with_object([]) & (->(i,m) { m << i.upcase })) 

Daher der Fehler. Ich bin nicht sicher, warum Sie nicht nur tun:

%w(foo bar baz).each_with_object([]) { |m,i| m << i.upcase } 
+0

Es war nur ein Beispiel, meine Blockstruktur hält die Logik schwieriger. Danke – DreamWalker

+0

"verwandelt ein Argument in den Block der Methode": Nur Formulierung, aber um genauer zu sein, ruft es 'to_proc' Methode auf dem Argument auf und übergibt es als Block an die aufgerufene Methode. – mudasobwa

Verwandte Themen