在Ruby中使用`include?`来检查哈希表中是否存在某个元素

7
我知道如何使用include?,但是不太清楚如何在多维数组或哈希表中使用它(在哈希表中是否可能?)。
例如,假设我有一个像这样的哈希表: @user.badges => [{:id => 1, :name => 'blahh', :description => 'blah blah blah'}, {:id => 2, :name => 'blahh', :description => 'blah blah blah'}] 我可以这样检查它是否有一个id为1的对象吗?
if @user.badges.include?(:id => 1)
  # do something
end

这个方法似乎无法正常工作,我应该如何正确地编写它?

1个回答

13

这不是有效的Ruby语法。你应该使用:

@user.badges.any? { |b| b[:id] == 1 }

谢谢Bob!我想我太理想化了,竟然认为可以把任何哈希当作数组来处理。 - JP Silvashy
1
嗯,你使用的语法有两个错误。首先,(:id => 1)不会解析为一个表达式(或其他任何东西)。其次,你调用了Array#include?,而不是Hash#include?。最后,Hash#include?只是Hash#has_key?的别名。 - Bob Aman
1
实际上,(:id => 1) 这部分在语法上是有效的。Ruby将其识别为 ({:id => 1}) 的缩写,你可以通过执行 badges.include?(:id => 1, :name => 'blahh', :description => 'blah blah blah') 查看结果返回 true。因此,这里的问题更确切地说是 Array#include? 只进行元素的精确匹配,而您正在尝试进行部分匹配。因此,您需要使用 any?,因为它允许您传递一个块而不仅仅是一个值。如果您需要返回匹配的哈希值,而不仅仅是检查其是否存在,则应使用 find 替换 any? - glenn mcdonald
我认为他试图做的是:{:id => 1, :name => 'blahh', :description => 'blah blah blah'}.include?(:id => 1),并没有注意到尽管意图不同,语法仍然有效。你是对的:如果 :id => 1 出现在方法的参数中,它会被组装成一个 Hash 并作为最后一个参数传递。但是,为了明确起见,在方法调用之外,这仍然是无效的语法。 - Bob Aman
我选择了 any? 这个路线,感谢你们的帮助! - JP Silvashy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接