2016-05-14 10 views
0

Beim Versuch, einen Block auf die Summe Methode zu übergeben:Keine Methode Fehler beim Passieren eines Blocks auf ein Verfahren

def sum(list, &block) 
    list.find_all{yield}.reduce(0, :+) 
end 
sum([12, 14, 0, 7, 56, 0]) {|i| i % 2 == 0} 

ich diesen Fehler:

NoMethodError: undefined method `%' for nil:NilClass

Meine Methode konnte das nicht erkennen i als ein Element in meiner Liste. Ich weiß nicht, wie ich es behebe. Irgendein Vorschlag?

Antwort

0
list.find_all { |i| yield i }.reduce(0, :+) 

oder äquivalent

list.find_all(&block).reduce(0, :+) 

Was Sie ursprünglich durch die Liste durchsucht schrieb, so dass für jedes Element, das Sie yield - das den Block ohne Parameter aufrufen würde, wird inil zugewiesen und nil % 2 ist schlecht .

+0

vielen Dank. Könnten Sie mir zeigen, wo ich diese Syntax in den Ruby-API-Dokumenten finden kann? Ich konnte es in der Rubin-Dokumentation nicht finden. –

+0

Wenn Sie über '& block' sprechen, habe ich [proc to block conversion] verwendet (http://docs.ruby-lang.org/de/2.0.0/syntax/calling_methods_rdoc.html#label-Proc+to+ Block + Konvertierung). 'block' ist ein' Proc'-Objekt, das vom [Blockargument] (http://docs.ruby-lang.org/de/2.0.0/syntax/methods_rdoc.html#label-Block+Argument) '& block erstellt wird 'in deinem eigenen Code. – Amadan

Verwandte Themen