【问题标题】:Why pipe equals doesn't work with tap in Ruby?为什么管道等于在 Ruby 中不能与 tap 一起使用?
【发布时间】:2018-01-31 05:42:45
【问题描述】:

如果我在.tap 上下文中修改数组,将返回修改后的版本:

states = [:a, :b].tap do |sts|
  sts << :c
end

puts states # [:a, :b, :c]

但如果我用|= 修改它,它会返回相同的对象:

states = [:a, :b].tap do |sts|
  [[:a, :c], [:b, :d]].each do |type|
    sts |= type
  end

  puts sts.inspect # [:a, :b, :c, :d]
end

puts states.inspect # [:a, :b]

能给我指出正确的方向吗?

【问题讨论】:

    标签: arrays ruby reference functional-programming iterator


    【解决方案1】:

    为什么会这样?

    简单,因为你没有改变原来的sts。您改为创建一个新数组(来自|= 运算符)并使sts 指向该新数组。当然,一旦tap 块返回,这个临时数组就永远丢失了。


    如果你不知道,

    sts |= type
    

    是一个快捷方式

    sts = sts | type
    

    【讨论】:

      【解决方案2】:

      来自文档:

      点击 {|x|块 } → obj

      将 self 交给块,然后返回 self。此方法的主要目的是“利用”方法链,以便对链中的中间结果执行操作。

      在第一种情况下,您修改传递的数组,因此它已更改。

      在第二种情况下,您只需创建一个新数组:

      a = [1, 2] # => [1, 2]
      b = a
      b |= [3] 
      a # => [1, 2]
      b # => [1, 2, 3]
      

      【讨论】:

      • 为什么我会想什么,“噪音”?老实说,我想知道它如何帮助展示任何东西? This is how I'd format it,例如。清洁器可复制粘贴。
      • 是的,如果我不清楚,对不起。显然,我不是在谈论代码。只是噪音:)
      猜你喜欢
      • 2021-05-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多