1

多くのキーを持つハッシュを作成し、nil値を持つキーを省略したい:

h = {
  :key0 => val0,
  :key1 => val1, # I want to include this key only if val1 is not nil
  :key2 => val2
}

それ以外に何か良い方法はありますか

if val1
  h = {
    :key0 => val0,
    :key1 => val1,
    :key2 => val2
  }
else
  h = {
    :key0 => val0,
    :key2 => val2
  }
end

の線に沿った何か

h = {
  :key0 => val0,
  :key1 => val1 if val1, # gives an error
  :key2 => val2
}

編集:これまでの回答に感謝します。本当に便利です。後で処理することなくハッシュリテラルを定義する方法はありますか?

4

3 に答える 3

4

Hash#keep_ifメソッドを試すことができます。このメソッドは、ブロックが false と評価されるすべてのキーと値のペアを hsh から削除します。

h = { :key0 => 'val0',:key1 => nil,:key2 => 'val2',:key4 =>nil}


h.keep_if {|key,value| !value.nil?}

{:key0=>"val0", :key2=>"val2"}

于 2013-02-27T18:03:42.430 に答える
0

「delete_if」メソッドは、ブロックに譲ることによって特定の要素を削除できます。そのブロックが要素に対して true を返す場合、その要素は削除されます。値が nil の要素を削除するには、コードは次のようになります。

val0 = true
val1 = nil
val2 = true

h = {
  :key0 => val0,
  :key1 => val1, # I want to include this key only if val1 is not nil
  :key2 => val2
}

h.delete_if{ |key, val| val.nil? }

puts h #=> {:key0=>true, :key2=>true}
于 2013-02-27T17:38:41.710 に答える
0

最も簡単な方法は、選択を行うことです。

{ :key0 => 1, :key1 => nil }.select {|_,v| v } 
#=> { :key0 => 1 }

この場合、vが 'falsey' (または のいずれfalsenil) の場合、ペアは省略されます。

于 2013-02-27T17:39:05.250 に答える