ハッシュがあり、その値はtrue
または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
あなたがしたいのがそれらがすべてtrue
であるかそれらがすべてであると評価することであるならば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