我创建了一个包含许多键的哈希,我想省略具有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
}
编辑:感谢到目前为止的回复,非常有用。有没有办法定义哈希文字而不必事后处理它?</ p>
答案 0 :(得分:4)
您可以尝试使用Hash#keep_if方法。该方法从hsh中删除每个键值对,其中块的计算结果为false。
h = { :key0 => 'val0',:key1 => nil,:key2 => 'val2',:key4 =>nil}
h.keep_if {|key,value| !value.nil?}
{:key0 =&gt;&#34; val0&#34;,:key2 =&gt;&#34; val2&#34;}
答案 1 :(得分:0)
“delete_if”-method可以通过屈服于一个块来删除某些元素。如果该块对元素返回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}
答案 2 :(得分:0)
最简单的方法是选择:
{ :key0 => 1, :key1 => nil }.select {|_,v| v }
#=> { :key0 => 1 }
在这种情况下,如果v
为'falsey'(false
或nil
),则该对将被省略。