通常的哈希,我们定义了一个散列作为添加一个关键只基于一个if语句
h={:a=>val1, :b=>val2}
不过,我想补充一个条件,只有在关键补充:B如果VAL2不是零值。像
h={:a=>val1}
h[:b]=val2 if val2
但它可以被封装在一个单一的行吗?
通常的哈希,我们定义了一个散列作为添加一个关键只基于一个if语句
h={:a=>val1, :b=>val2}
不过,我想补充一个条件,只有在关键补充:B如果VAL2不是零值。像
h={:a=>val1}
h[:b]=val2 if val2
但它可以被封装在一个单一的行吗?
h = { :a => val1 }.merge(val2 ? { :b => val2 } : {})
但不这样做。只是保持简单。
h[:b] = val unless val.nil?
这与原来的没有什么不同... – alternative 2010-08-28 23:49:13
我想我的观点是,担心只用一行来做是件愚蠢的事。谁在乎?担心真正的问题。 – 2010-08-29 03:05:57
点了!感谢您的注意 – 2010-09-01 18:54:02
你可以为那一个散列重写[] =运算符,或者创建一个散列的子类并在那里覆盖它。
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
这对于现在来说太复杂了,但对于有这种需求的未来项目来说会很好,谢谢! – 2010-09-01 18:54:43
你不必担心哈希零元素,因为你可以简单地从他们清理哈希:
{:a => 1, :b => nil}.reject { |k, v| v.nil? } # {:a => 1}
但是,即使其值为零,OP似乎也希望[:a]在那里。 – 2010-08-29 15:15:45
红宝石2.4中,你可以使用Hash#compact
h = { a: 1, b: false, c: nil }
h.compact #=> { a: 1, b: false }
h #=> { a: 1, b: false, c: nil }
我除非你的显示器是半英寸高,否则没有看到有任何理由在一条线上做这件事。 – Skilldrick 2010-08-28 23:12:24