通常,我们将哈希定义为
h={:a=>val1, :b=>val2}
但是,我想添加一个条件只添加键:b如果val2不是nil值。像
这样的东西h={:a=>val1}
h[:b]=val2 if val2
但它可以封装在一行吗?
答案 0 :(得分:3)
h = { :a => val1 }.merge(val2 ? { :b => val2 } : {})
但不要这样做。保持简单。
答案 1 :(得分:3)
你不必担心哈希中的nil元素,因为你可以简单地从它们中清除哈希:
{:a => 1, :b => nil}.reject { |k, v| v.nil? } # {:a => 1}
答案 2 :(得分:2)
h[:b] = val unless val.nil?
答案 3 :(得分:1)
你可以只覆盖那个哈希的[] =运算符,或者创建哈希的子类并在那里覆盖它。
hash = {}
class << hash
def []=(key, value)
case key
when :b
raise StandardError("Invalid :b value") if value.nil?
end
super(key,value)
end
end
hash[:a] = 10
hash[:b] = nil # Will raise exception
答案 4 :(得分:1)
从ruby 2.4开始,您可以使用Hash#compact
h = { a: 1, b: false, c: nil }
h.compact #=> { a: 1, b: false }
h #=> { a: 1, b: false, c: nil }