我想知道,确定具有2个键/值对的散列是否只包含错误值的最简单方法是什么
hash = {key1: false, key2: false}
如何在条件下检查这一点。我知道all?
,但我很好奇是否有更简单的东西,因为它只有2个值。
提前致谢!
答案 0 :(得分:6)
my_hash.values.uniq == [false]
或
my_hash.invert.keys == [false]
答案 1 :(得分:4)
这也可以是一个选项
hash = old_hash.dup
hash.delete_if {|x,v| v == false} == {}
我做过基准测试
hash = {key1: false, key2: false, key3: false, key4: false}
n = 100000
Benchmark.bm do |x|
x.report do
n.times do
hash.values.uniq == [false]
end
end
end
# user system total real
# 0.110000 0.000000 0.110000 ( 0.103477)
hash = {key1: false, key2: false, key3: false, key4: false}
n = 100000
Benchmark.bm do |x|
x.report do
n.times do
hash.delete_if {|x,v| v == false} == {}
end
end
end
# user system total real
# 0.030000 0.000000 0.030000 ( 0.026449)
但是,我认为代码应该更具可读性,所以我建议@Cary Swoveland的答案
答案 2 :(得分:2)
假设哈希值不能是nil
(这是假的):
hash.values.none?
或者,为了对false
进行精确检查,而不是falsey
:
hash.values.all? { |e| e == false } # this works with `nil`s properly
或:
!hash.values.reduce(&:|)
或(只是出于好奇):
hash.values.uniq.tap do |a|
raise if a.pop == false && a.empty?
end.first rescue true
或:
hash.values == [false] * hash.size
答案 3 :(得分:2)
hash.values.uniq.length == 1 && hash.values.uniq.include?(false)
答案 4 :(得分:0)
两个键的最简单方法:
!(hash[:key1] || hash[:key2])
#=> true
一个缺点:也会为true
值返回nil
。