在哈希中有条件地包含键值对

有人可以帮我缩短以下方法吗? 我从这开始,我很喜欢这个:

def self.some_hash { "foo" => "bar" } end 

现在我想添加一个可选键。 我能想到的最简洁的语法是这样的:

 def self.some_hash(some_key=nil) answer = { "foo" => "bar" } answer[some_key] = "yucky, long-winded syntax" if some_key answer end 

修改后的方法有效,但我对虚拟墨水的浪费感到不满意。 有没有办法缩短它? 我意识到可以在哈希文字上使用三元运算符,但这会强制(我认为)在条件的每个分支上重复"foo" => "bar"对,这也略微小于原始状态。

 def self.some_hash(some_key = nil) {"foo" => "bar"}.merge(some_key ? {some_key => "yucky, long-winded syntax"} : {}) end 

或者,如果修改原始哈希,

 def self.some_hash(some_key = nil) {"foo" => "bar"} .tap{|h| h.merge!(some_key => "yucky, long-winded syntax") if some_key} end 

或者,也许你可以以接近原作的方式做到:

 def self.some_hash(some_key = nil) {"foo" => "bar"} .tap{|h| h[some_key] = "yucky, long-winded syntax" if some_key} end 

我真的不喜欢它,但这很简洁(而且令人困惑)

 def self.some_hash(some_key=nil) Hash[[["foo", "bar"], [some_key, "some value"]].select(&:first)] end 

这可能会好一些。

 def self.some_hash(some_key=nil) {"foo" => "bar", some_key => "some_value"}.keep_if{ |k, _| k } end 

哈希#keep_if