0

複数のメンバーを条件付きで追加したハッシュを作成したいと思います。簡単なアプローチは次のとおりです。

var a = {}
a['b'] = 5 if condition_b
a['c'] = 5 if condition_c
a['d'] = 5 if condition_d

ここで、より慣用的なコードを書きたいと思います。やっています:

a = {
    b => (condition_b? 5 : null),
    c => (condition_c? 5 : null),
    d => (condition_d? 5 : null)
}

しかし今では、a.lengthどの条件が満たされていても 3 に等しい。これは望ましい結果ではありません。

便利な解決策はありますか?

4

3 に答える 3

1

あなたが望むものではないかもしれませんが、これは役に立ちます

 array = ['b','c','d']  ##array of values you want as keys 
 a ={}
 array.each do |val|
   a[val] = 5 if send("condition_"+val.to_s)  #call method condition_#{key_name}
 end

条件が関連していない場合は、独自のハッシュを使用できます。

a = {
    b => (condition_b? 5 : nil),
    c => (condition_c? 5 : nil),
    d => (condition_d? 5 : nil)
}
a.values.compact.size

nil 以外の値の長さを取得する

于 2012-07-29T07:06:43.717 に答える
0

次のように、条件が満たされた場合にのみハッシュに追加するのはどうですか。

a = {}
a.merge!({'b'=>5}) if condition_b
a.merge!({'c'=>5}) if condition_c
于 2013-01-27T11:29:36.740 に答える
-1

2番目の方法では、常に3つのキーを使用します。条件は特定の値のみを決定します。したがって、その構文を使用する場合は、キーがnilでない場合にのみキーをカウントするカスタムメソッドを定義する必要があります(また、Rubyではnilであり、nullではありません)。何かのようなもの:

def non_nil_length(hash)
  i = 0
  hash.each_pair do |k,v|
    if !v.nil?
      i += 1
    end
  end
  i
end

それを行うにはおそらくもっと良い方法がありますが、迅速で汚い方法があります。

于 2012-07-29T05:41:02.967 に答える