仅基于if语句向哈希添加密钥

时间:2010-08-28 23:10:56

标签: ruby refactoring

通常,我们将哈希定义为

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

但是,我想添加一个条件只添加键:b如果val2不是nil值。像

这样的东西
h={:a=>val1}
h[:b]=val2 if val2

但它可以封装在一行吗?

5 个答案:

答案 0 :(得分:3)

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

但不要这样做。保持简单。

答案 1 :(得分:3)

你不必担心哈希中的nil元素,因为你可以简单地从它们中清除哈希:

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

答案 2 :(得分:2)

h[:b] = val unless val.nil?

答案 3 :(得分: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

答案 4 :(得分:1)

从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 }