您将如何简化此ruby哈希操作?

时间:2013-08-20 14:46:46

标签: ruby

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

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

上面的代码运行正常,但是Ruby有很多很好的哈希和数组运算符,我想知道是否有更简洁的方法来编写它(可能是使用splat运算符的东西)。

3 个答案:

答案 0 :(得分:2)

你的解决方案看起来不错,尽管我反过来会这样做:

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

答案 1 :(得分:0)

特定密钥

如果您只想检查: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? }

这将拒绝nil散列中params作为值的所有键值对。

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

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

答案 2 :(得分:0)

你也可以使用拒绝:

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