2016-05-14 2 views
0

にブロックを渡す:ない方法エラーサムメソッドにブロックを渡そうとしたときの方法

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

を、私はこのエラーを取得する:

NoMethodError: undefined method `%' for nil:NilClass

私の方法は認識しませんでしたi私のリストの要素として。私はそれをどのように修正するのか分かりません。なにか提案を?

答えて

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

または同等の各要素のためにあなたがyieldように、リスト内を検索あなたは、もともと書いた何

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

- これはinilが割り当てられます、パラメータなしでブロックを呼び出します、とnil % 2が悪いです。

+0

ありがとうございます。 Ruby APIのドキュメントでその構文をどこで見つけることができますか?私はそれをルビ文書で見つけることができませんでした。 –

+0

あなたは[変換をブロックするPROC](http://docs.ruby-lang.org/en/2.0.0/syntax/calling_methods_rdoc.html#label-Proc+to+、私が使用し '&block'の話をしている場合ブロック+変換)。 'block'は[ブロック引数](http://docs.ruby-lang.org/en/2.0.0/syntax/methods_rdoc.html#label-Block+Argument)で作成された' Proc'オブジェクトです。 '&block 'あなた自身のコードで。 – Amadan

関連する問題