2

ハッシュがあり、その値は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  

これを書くためのより良い方法はありますか?

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

あなたがしたいのがそれらがすべて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?

于 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 に答える