有没有更好的方法来判断一个ruby散列是否在另一个ruby散列中?

有没有更好的方法来判断一个ruby散列是否在另一个ruby散列中?,ruby,hash,Ruby,Hash,例如hasha是{:name=>'mike',:age=>27,:gender=>'male'} hashb是{:name=>'mike'} 我想知道有没有更好的方法来判断b散列是否在a散列中,而不是逐个比较每个键 我已经找到了一种方法,这比比较键更有效吗 a、 合并(b)=a 这个循环的大小为b,是线性的,因为循环内的两个步骤(平均)都需要恒定的时间。我喜欢计算交叉点的方法,这就是你要做的: a = { :a => :b, :c => :d } b = { :e => :f,

例如hash
a
{:name=>'mike',:age=>27,:gender=>'male'}
hash
b
{:name=>'mike'}

我想知道有没有更好的方法来判断
b
散列是否在
a
散列中,而不是逐个比较每个键

我已经找到了一种方法,这比比较键更有效吗

a、 合并(b)=a


这个循环的大小为b,是线性的,因为循环内的两个步骤(平均)都需要恒定的时间。

我喜欢计算交叉点的方法,这就是你要做的:

a = { :a => :b, :c => :d }
b = { :e => :f, :a => :b }
c = { :a => :f, :e => :c }

(a.to_a & b.to_a).any? # => true
(a.to_a & c.to_a).any? # => false

考虑到它是一个散列,比较密钥非常有效,您不必关心它。此外,合并效率很低,因为它将在内存中生成一个新的散列,您应该比较密钥。谢谢Mauricio,大师!电话包括?然后一个[key]使这段代码非常低效,因为它试图两次找到这个键。@MaurícioLinhares:对哈希的访问是O(1),所以我不明白为什么这会低效。事实上,我认为这是概念上最有效的代码(尽管转换为数组并与它们相交可能更快,因为这种相交是用C实现的)。我想把
包含?
改为
有钥匙?
,这样更清楚一点。为什么要为第二个条件创建一条新的(未凹入的)线?
a = { :a => :b, :c => :d }
b = { :e => :f, :a => :b }
c = { :a => :f, :e => :c }

(a.to_a & b.to_a).any? # => true
(a.to_a & c.to_a).any? # => false