Ruby 确定哈希是否包含一组密钥中的任何密钥?

Ruby 确定哈希是否包含一组密钥中的任何密钥?,ruby,hash,Ruby,Hash,你知道一个很好的ruby方法来判断散列是否有某个键吗 h = {:a => 1, :c => 3, :d => 4} # keys to find are :a, :b or :e 我知道我能做到: h.key?(:a) || h.key?(:b) || h.key?(:e) 但我想知道是否有更漂亮的方法来做这件事!:) 非常感谢 考虑 来自IRB: >> h = {:a => 1}; [:x].any? {|k| h.key?(k)}

你知道一个很好的ruby方法来判断散列是否有某个键吗

h = {:a => 1, :c => 3, :d => 4}
# keys to find are :a, :b or :e
我知道我能做到:

h.key?(:a) || h.key?(:b) || h.key?(:e)
但我想知道是否有更漂亮的方法来做这件事!:)

非常感谢

考虑

来自IRB:

>> h = {:a => 1}; [:x].any? {|k| h.key?(k)} => false >> h = {:a => 1}; [:x, :a].any? {|k| h.key?(k)} => true >>h={:a=>1};[:x]。有吗?{| k | h.key?(k)} =>错误 >>h={:a=>1};[:x,:a]有吗?{| k | h.key?(k)} =>正确
快乐编码。

我会这样做:

[:a, :b, :e].any?{ |val| h.key?(val) } 

以下是如何从数组中获取所有匹配的键:

> {:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]
 => [:a, :d] 
如果你想要一个布尔值(按照安德鲁的建议):


您将得到匹配键的散列(键和值)作为返回(没有空?

+1个具有设置交集的“可选”解决方案。我会将结果的长度>0添加到至少一个键。@pst:如果您只需要一个布尔值,可以使用
.empty?
.any?
来检查相反的值。键将符号键转换为字符串,因此应该像-{:a=>1,:c=>3,:d=>4}一样进行检查。键和['a',d',e']+1用于不同的答案。但是,这会将操作变成
O(k*n)
,其中,
k
是散列中的键数,
n
是包含要尝试查找的键的序列长度。请检查这个不使用任何循环的绝妙答案:当然,如果您想查看它是否指定了所有键,请使用
.all?
)。喜欢这个代码-谢谢!
> {:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]
 => [:a, :d] 
> ({:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]).empty?
 => false 
> ({:a => 1, :c => 3, :d => 4}.keys & [:f, :e]).empty?
 => true 
h.select{|k| [:b, :w, :e].include?(k) }.empty?
h.select{|k| [:a, :w, :e].include?(k) }.empty?