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方法。该方法从 hsh 中删除块评估为 false 的每个键值对。

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 回答