【发布时间】:2010-08-28 23:10:56
【问题描述】:
通常,我们将哈希定义为
h={:a=>val1, :b=>val2}
但是,如果 val2 不是 nil 值,我想添加一个条件以仅添加键 :b。类似的东西
h={:a=>val1}
h[:b]=val2 if val2
但是可以封装成一行吗?
【问题讨论】:
-
我看不出有什么好的理由在一行上这样做,除非你的显示器有半英寸高。
标签: ruby refactoring
通常,我们将哈希定义为
h={:a=>val1, :b=>val2}
但是,如果 val2 不是 nil 值,我想添加一个条件以仅添加键 :b。类似的东西
h={:a=>val1}
h[:b]=val2 if val2
但是可以封装成一行吗?
【问题讨论】:
标签: ruby refactoring
h = { :a => val1 }.merge(val2 ? { :b => val2 } : {})
但不要这样做。保持简单。
【讨论】:
您不必担心哈希中的 nil 元素,因为您可以简单地从它们中清除哈希:
{:a => 1, :b => nil}.reject { |k, v| v.nil? } # {:a => 1}
【讨论】:
h[:b] = val unless val.nil?
【讨论】:
从 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 }
【讨论】:
您可以只为那个哈希覆盖 []= 运算符,或者创建一个 Hash 的子类并在那里覆盖它。
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
【讨论】: