我有一个哈希值,其值为true
or false
。查看这个散列的给定子散列的所有值是否相同的最 Ruby 风格的方法是什么?
h[:a] = true
h[:b] = true
h[:c] = true
h[:d] = false
[h[:a], h[:b], h[:c]].include? false
[h[:a], h[:b], h[:c]].include? true
有没有更好的方法来写这个?
values_at
是从哈希中获取值集合的方法:
h.values_at(:a,:b,:c).all? #are they all true?
h.values_at(:a,:b,:c).any? #is at least one of them true?
h.values_at(:a,:b,:c).none? #are they all false?
> [h[:a], h[:b], h[:c]].all?
=> true
> [h[:a], h[:b], h[:d]].all?
=> false
> [h[:a], h[:b], h[:d]].all?
=> false
> [h[:d]].none?
=> true
根据您的需要,编写如下内容可能更简洁:
> [:a, :b, :c].all? { |key| h[key] }
=> true
> [:a, :b, :d].all? { |key| h[key] }
=> false
> [:a, :d].none? { |key| h[key] }
=> false
> [:d].none? { |key| h[key] }
=> true
如果您只想评估它们是 ALLtrue
还是它们是 ALL false
:
h[:a] && h[:b] && h[:c] && h[:d] # => false
!(h[:a] || h[:b] || h[:c] || h[:d]) # => false
h[:a] && h[:b] && h[:c] # => true
!h[:d] # => true
否则,正如 Dave Newton 所指出的,您可以使用#all?
,#any?
和#none?
方法。
另一种通用方法:
whatever.uniq.size == 1
这直接测试所有值是否whatever
相同。所以,在你的情况下,
h.values_at(:a, :b, :c).uniq.size == 1