是否有任何规范期望通过单独排除指定键来比较两个哈希。
H1 = {'name' => 'XXXXx', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
H2 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
通过单独排除DOB密钥来比较以上两个哈希。
答案 0 :(得分:2)
我不明白您为什么需要这么做,但是您可以使用Hash#delete_if
RSpec.describe do
let(:hash1) { {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} }
let(:hash2) { {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} }
it 'should correctly compare two subhashes' do
expect(hash1.delete_if { |k,_| k == 'DOB' }).to eql(hash2.delete_if { |k,_| k == 'DOB' })
end
end
如果您想更整洁地expect
,可以先转换哈希。
您还可以使用Hash#reject
RSpec.describe do
it 'should correctly compare two subhashes' do
hash1 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
hash2 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
hash1, hash2 = [hash1, hash2].map { |h| h.reject { |k,_| k == 'DOB' } }
expect(hash1).to eql(hash2)
end
end
答案 1 :(得分:1)
除了比较键H1
(如果存在)的两个H2
和'DOB'
的临时哈希值之外,还可以比较两个具有关键字'DOB'
的临时哈希值具有相同的值。这个值是任意的;我用过nil
。
expect(H1.merge('DOB'=>nil).to eq(H2.merge('DOB'=>nil)))
另一种方法是:
expect((H1.keys|H2.keys).all? do |k|
k=='DOB' || (H1.key?(k) && H2.key?(k) && H1[k]==H2[k])
end.to eq(true)
H1.key?(k) && H2.key?(k)
在其中一个哈希值具有值k
的键nil
而另一个哈希值没有键k
的情况下。
与我上面提到的两种方法相比,它具有可赎回的功能,即对内存的要求更适中。