steenslagが言ったことに追加するだけです:
detect
常に nil を返すとは限りません。
detect が項目を「検出」(検索) しない場合は、ラムダを渡して実行 (呼び出し) することができます。つまり、detect
何かを検出 (検出) できない場合の対処方法を指定できます。
あなたの例に追加するには:
not_found = lambda { "uh oh. couldn't detect anything!"}
# try to find something that isn't in the Enumerable object:
@array.detect(not_found) {|h| h[:status] == 'X'}
戻ります"uh oh. couldn't detect anything!"
これは、この種のコードを記述する必要がないことを意味します。
if (result = @array.detect {|h| h[:status] == 'X'}).nil?
# show some error, do something here to handle it
# (this would be the behavior you'd put into your lambda)
else
# deal nicely with the result
end
any?
これがとの大きな違いの 1 つdetect
ですany?
。アイテムが見つからない場合、何をすべきかわかりません。
これは Enumerable クラスにあります。参照: http://ruby-doc.org/core/classes/Enumerable.html#M003123