【问题标题】:How would you simplify this ruby hash operation?你将如何简化这个 ruby​​ 哈希操作?
【发布时间】:2013-08-22 16:23:56
【问题描述】:

我需要创建一个包含多个参数的哈希。如果max_id 参数的值为nil,但我想从哈希中删除键:

params = { since_id: since_id, count: 50, max_id: max_id }
params.delete( :max_id ) unless max_id

上面的代码运行良好,但是 Ruby 有很多不错的哈希和数组运算符,我想知道是否有更简洁的方法来编写它(也许使用 splat 运算符)。

【问题讨论】:

  • 我也预料到了,但删除实际上是破坏性的,所以你不需要爆炸

标签: ruby


【解决方案1】:

您的解决方案看起来不错,虽然我会反过来做:

params = { since_id: since_id, count: 50 }
params[:max_id] = max_id if max_id

【讨论】:

  • 在这种情况下应该是params[:max_id] = max_id if max_id,因为您正在反转方法吗?
  • 谢谢。不过既然OP提到了nil,也许它应该是... if max_id.nil?。无论如何都要 +1
  • 是的,它在 OP 中是模棱两可的。这就是为什么我还是给了你+1。
【解决方案2】:

你也可以使用拒绝:

params = params.reject {|key,value| value == nil }

【讨论】:

  • reject! 会更短
  • Doh - 完全忘记了这一点,因为我通常不使用修改版本。谢谢。
【解决方案3】:

一个特定的键

如果您只想检查:max_id,那么您的解决方案:

params.delete( :max_id ) unless max_id

是最干净的。请注意,如果max_idfalse 则键值对将被删除,因此我建议您改用以下版本:

params.delete( :max_id ) if max_id.nil?

通用键

如果值为 nil,我能想到的最简洁的方法是使用哈希方法删除键值对,即使用 Hash#reject!

params.reject! { |k, v| v.nil? }

这将拒绝所有在 params 哈希中具有 nil 作为值的键值对。

还有其他选择。以下所有行都是等效的(除了它们的返回值):

params.reject! { |k, v| v.nil? }
params.select! { |k, v| not v.nil? }
params.delete_if { |k, v| not v.nil? }

【讨论】:

  • 不应该是“value != nil”或类似的吗? (值而不是键,并且 nil.is_nil? 似乎引发了异常,而 nil != nil 有效)
  • 道歉 - 我没有把这个问题说得足够清楚。它实际上比这更简单 - 我只想删除一个指定参数max_id
  • @FrankSchmitt,是的,我在这个答案的早期版本中犯了很多错误。现在它们应该都是正确的(或者至少我的irb 是这么说的)。
  • @PeterNixey,我已经编辑了我的答案以包括我的旧答案和正确答案。希望对您有所帮助:)。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多