【问题标题】:Apply something to certain value of a hash, return the whole hash将某些东西应用于哈希的某个值,返回整个哈希
【发布时间】:2014-08-20 19:01:12
【问题描述】:

在 Ruby 中以功能性和不可变的方式这样做的正确方法是什么:

a = { price: 100, foo: :bar, bar: :baz }

def reduced_price(row)
  row.merge(price: row[:price] / 2)
end

reduced_price(a) # => { price: 50, foo: :bar, bar: :baz }

我不想改变任何东西,我不喜欢 row.merge(key: row[:key]) 的构造,因为它重复了 :key 并引用了 row 两次。如果有类似的东西:

{a: 1, b: 2}.apply_to_key(:a) { |x| x * 10 } # => {a: 10, b: 2}

那太好了。

总而言之,我想要一个方法,当给定一个键时,该键使用前一个值更新散列的单个值,然后返回整个散列。

【问题讨论】:

    标签: ruby functional-programming method-chaining


    【解决方案1】:

    在我写这个问题的时候,我找到了答案。由于 SO 建议以问答方式分享我的知识,因此这里是:

    {a: 1, b: 2}.merge(a: nil) { |_, v| v * 10 } # => {a: 10, b: 2}
    

    当您将一个块传递给hash.merge(other_hash) 时,它将针对带有参数key, oldval, newval 的每一对other_hash 执行,并且应该返回结果值。在上面的例子中,我的 other_hash 只包含一个我想要更改的键,并且从三个参数中我只关心第二个,old_val,以便在我的块中使用它。

    它是完全可链接的,不会改变任何东西。它有一点冗余(必须将nil 或任何其他值传递给other_hash,必须忽略块的第一个参数),但我想这是我能得到的最接近的。

    如果你能提出更好的答案,我会考虑接受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 2019-10-09
      • 2016-08-31
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      相关资源
      最近更新 更多