【问题标题】:Conditional inclusion of a key-value pair in a hash [closed]在哈希中条件包含键值对[关闭]
【发布时间】:2023-03-15 07:30:02
【问题描述】:

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

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" 对,这也比原始的略少。

【问题讨论】:

  • “帮我缩短以下方法”是一个赠品,这应该在 codereview.stackexchange.com 上进行审查并帮助重构和优化。
  • 很遗憾看到这个问题结束了,当它真正问的是“我如何有条件地在哈希中包含一个键/值对?”。我用Ruby 2.0's double-splat operator在别处写了一个答案。
  • @PaulAJungwirth,我想它已关闭,因为我只想改进工作代码。相反,我可能编造了一些垃圾语法,然后说它不起作用,而且在 SO 中一切都会好起来的。这是关于 ** 运算符的一个很好的提示!谢谢 谢谢!
  • 没有一个答案提到 ** 运算符这一事实表明这个问题是相关的。但是,它是 stackoverflow.com/questions/5750770/… 的副本……因此应该关闭。
  • 这个问题是关于编程语言语法的具体问题。这显然是主题。

标签: ruby hashtable


【解决方案1】:
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

【讨论】:

  • 哦。这真是太好了。像@Kyle 一样简短,而且更清晰。也很好,因为它有条件地包含而不是删除。谢谢。
  • +1 表示第一个(功能性)sn-p,我会尽可能远离tap(恕我直言,它提倡命令式、不清楚的代码)
  • 谢谢。也感谢了解 .tap。元问题:感谢您编辑我的问题。我必须采取一些步骤来接受编辑吗?
  • @steenslag 感谢您纠正我的错字。
  • @danh 正如 steenslag 纠正的那样,我的回答中有错字。请注意使用更正版本。对于编辑,这取决于谁编辑。我认为 steenslag 有足够的声望点可以自己编辑。如果一个人没有足够的声誉进行编辑,那么它需要得到其他有足够积分的人的批准才能这样做。
【解决方案2】:

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

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

Hash#keep_if

【讨论】:

  • 谢谢。为简洁起见,它至少是+1。稍等一下,看看还有什么建议。
  • @danh 我为你添加了一个我认为更好一点的。
  • 我希望我能投票两次。我认为您的第二个想法更清晰、更简短,但@sawa 使我们免于执行添加 + 条件删除。从未听说过keep_if,也很感激学习!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 2015-11-04
  • 2011-06-14
  • 2016-07-11
相关资源
最近更新 更多