我想知道,如果具有 2 个键/值对的哈希仅包含假值,最简单的方法是什么
hash = {key1: false, key2: false}
我如何在某种情况下检查这一点。我知道all?
但我很好奇是否会有更简单的东西,因为它只有 2 个值。
提前感谢!
my_hash.values.uniq == [false]
或
my_hash.invert.keys == [false]
这也
是一种选择
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 的答案
hash.values.uniq.length == 1 && hash.values.uniq.include?(false)
假设哈希值不能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
两个键的最简单方法:
!(hash[:key1] || hash[:key2])
#=> true
一个缺点:对于nil
值,也会返回true
。