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 并不总是返回零。

如果检测没有“检测”(找到)一个项目,您可以传入一个 lambda 来执行(调用)。换句话说,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?这是和之间的一个主要区别——如果它没有找到任何项目,detect你不知道该怎么做。any?

这是在 Enumerable 类中。参考:http ://ruby-doc.org/core/classes/Enumerable.html#M003123

于 2014-07-23T20:51:33.123 回答