我正在使用Ruby on Rails 3.0.10,我想以一种有条件的方式构建一个哈希键\值对.也就是说,如果条件匹配,我想添加一个键及其相关值:

hash = {
  :key1 => value1,
  :key2 => value2, # This key2\value2 pair should be added only 'if condition' is 'true'
  :key3 => value3,
  ...
}

我怎样才能做到这一点,并为代码保留"good" readability?我是否"被迫"使用merge法?

推荐答案

我更喜欢tap,因为我认为它提供了一个比这里描述的更干净的解决方案,它不需要任何恶意删除元素,并且明确定义了构建散列的范围.

这也意味着你不需要声明一个不必要的局部变量,我一直讨厌它.

如果你以前没有遇到过,tap是非常简单的——它是Object上的一个方法,它接受一个块并总是返回调用它的对象.因此,要有条件地构建散列,可以这样做:

Hash.new.tap do |my_hash|
  my_hash[:x] = 1 if condition_1
  my_hash[:y] = 2 if condition_2
  ...
end

tap有很多有趣的用途,这只是其中之一.

Ruby相关问答推荐

运行跳过的RSpec测试,如果通过则失败

鲁比.METHOD_MISSING+SEND对于带有命名参数的混合参数失败

如何判断 postgres 中使用 ruby​​ 的查询是否失败?

如何解密在 sjcl.js 中使用 ruby​​ 创建的 AES-256-GCM

Ruby注入daisy链?

将数组转换为哈希,其中键是索引

在 Ruby 中,如何确定字符串是否不在数组中?

我如何 expect期望在 RSpec 中引发异常的东西?

如何使用 RVM 重新编译 ruby​​?

hash['key'] 到 Ruby 中的 hash.key

Ruby 被空格分割

如何删除Ruby中数组中满足条件的所有元素?

为什么 Ruby 无法验证 SSL 证书?

判断散列的键是否包含所有键集

正则表达式,如何匹配多行?

以小时为单位的时差

如何将 270921sec 转换为天 + 小时 + 分钟 + 秒? (Ruby)

Ruby:如何计算一个字符串在另一个字符串中出现的次数?

=== 与 == 在 Ruby 中

def `self.function` 名称是什么意思?