通常的哈希,我們定義了一個散列作爲添加一個關鍵只基於一個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