2010-08-28 56 views
2

通常的哈希,我们定义了一个散列作为添加一个关键只基于一个if语句

h={:a=>val1, :b=>val2} 

不过,我想补充一个条件,只有在关键补充:B如果VAL2不是零值。像

h={:a=>val1} 
h[:b]=val2 if val2 

但它可以被封装在一个单一的行吗?

+4

我除非你的显示器是半英寸高,否则没有看到有任何理由在一条线上做这件事。 – Skilldrick 2010-08-28 23:12:24

回答

3
h = { :a => val1 }.merge(val2 ? { :b => val2 } : {}) 

但不这样做。只是保持简单。

2
h[:b] = val unless val.nil? 
+1

这与原来的没有什么不同... – alternative 2010-08-28 23:49:13

+0

我想我的观点是,担心只用一行来做是件愚蠢的事。谁在乎?担心真正的问题。 – 2010-08-29 03:05:57

+0

点了!感谢您的注意 – 2010-09-01 18:54:02

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 
+0

这对于现在来说太复杂了,但对于有这种需求的未来项目来说会很好,谢谢! – 2010-09-01 18:54:43

2

你不必担心哈希零元素,因为你可以简单地从他们清理哈希:

{:a => 1, :b => nil}.reject { |k, v| v.nil? } # {:a => 1} 
+0

但是,即使其值为零,OP似乎也希望[:a]在那里。 – 2010-08-29 15:15:45

0

红宝石2.4中,你可以使用Hash#compact

h = { a: 1, b: false, c: nil } 
h.compact  #=> { a: 1, b: false } 
h    #=> { a: 1, b: false, c: nil }