2

我有一个哈希值,其值为trueor 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  

有没有更好的方法来写这个?

4

4 回答 4

8

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?
于 2013-01-21T23:00:14.900 回答
1
> [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
于 2013-01-21T22:27:11.247 回答
1

如果您只想评估它们是 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?方法。

于 2013-01-21T22:38:46.527 回答
0

另一种通用方法:

whatever.uniq.size == 1

这直接测试所有值是否whatever相同。所以,在你的情况下,

h.values_at(:a, :b, :c).uniq.size == 1
于 2013-01-22T01:43:31.810 回答