2010-08-28 58 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 }