0

私はハッシュの配列を持っています:

@array = [{:id => "1", :status=>"R"},
      {:id => "1", :status=>"R"},
      {:id => "1", :status=>"B"},
      {:id => "1", :status=>"R"}]

検出方法、ステータス「B」の値を持つハッシュに含まれていますか? 単純な配列のように:

@array = ["R","R","B","R"]
puts "Contain B" if @array.include?("B")
4

3 に答える 3

6

使用any?:

@array.any? { |h| h[:status] == "B" }
于 2012-06-22T14:43:50.610 に答える
2

配列 (実際には列挙型) にはdetectメソッドがあります。nil何も検出されない場合は a を返すので、Andrew Marshall の のように使用できますany

@array = [{:id => "1", :status=>"R"}, 
      {:id => "1", :status=>"R"}, 
      {:id => "1", :status=>"B"}, 
      {:id => "1", :status=>"R"}] 
puts "Has status B" if @array.detect{|h| h[:status] == 'B'}
于 2012-06-22T15:50:20.290 に答える
0

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

于 2014-07-23T20:51:33.123 に答える