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

dan*_*anh 12 ruby hashtable

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

def self.some_hash
  { "foo" => "bar" }
end
Run Code Online (Sandbox Code Playgroud)

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

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

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

saw*_*awa 10

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

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

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

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

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