为什么管道等于Ruby不适用?

时间:2017-08-22 20:01:23

标签: arrays ruby reference functional-programming iterator

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

.tap

但如果我用states = [:a, :b].tap do |sts| sts << :c end puts states # [:a, :b, :c] 修改它,它会返回相同的对象:

|=

可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

  

为什么?

很简单,因为您不会更改原始sts。您改为创建一个新数组(来自|=运算符)并使sts指向该新数组。当然,只要tap块返回,这个临时数组就会永远丢失。

如果您不知道,

sts |= type

的快捷方式
sts = sts | type

答案 1 :(得分:1)

来自文档:

  

点按{| x |阻止}→obj

     

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

在第一种情况下,您修改传递的数组,以便更改。

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

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