在哈希中条件包含键值对[关闭]

Posted

技术标签:

【中文标题】在哈希中条件包含键值对[关闭]【英文标题】:Conditional inclusion of a key-value pair in a hash [closed] 【发布时间】:2012-12-20 00:03:14 【问题描述】:

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

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 中一切都会好起来的。这是关于 ** 运算符的一个很好的提示!谢谢 谢谢! 没有一个答案提到 ** 运算符这一事实表明这个问题是相关的。但是,它是 ***.com/questions/5750770/… 的副本……因此应该关闭。 这个问题是关于编程语言语法的具体问题。这显然是主题。 【参考方案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,也很感激学习!

以上是关于在哈希中条件包含键值对[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在c#中,啥叫键/值对?啥叫哈希代码?

从 Ruby 哈希中转移一个特定的匹配键值对

Redis之字典

如何在 ngfor 中向元素添加 id 以及在 ngfor 中条件创建元素

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

perl 怎么增加hash键值对