为什么
a = [].tap do |x|
x << 1
end
puts "a: #{a}"
按预期工作
a: [1]
但
b = [].tap do |x|
x = [1]
end
puts "b: #{b}"
不
b: []
答案 0 :(得分:3)
第二个代码段不更改数组的原因与此代码段的原因相同:
def foo(x)
x = [1]
end
a = []
foo(a)
不会更改变量a。代码中的变量x对于块的范围是本地的,因此可以为其分配任何内容,但是赋值在外部不可见(Ruby是一种按值传递的语言)。
当然,块在声明它们的局部变量上也有闭包,所以这将起作用:
def foo(x)
yield(x)
end
b = []
foo(123) do |x|
b = [1]
end
p b # outputs [1]
答案 1 :(得分:0)
第一种方法将1放在空数组的末尾。同样地,你不能说空数组等于1.相反,你会尝试复制它......
b = [].tap do |x|
x.unshift(1)
end
这只是一个示例,但请查看可以通过键入来在阵列上使用的方法调用。
Array.methods.sort
一切顺利
答案 2 :(得分:0)
这有些不相关 - 但[].tap
成语很可怕。你不应该使用它。甚至许多在rails代码中使用它的人现在承认它很糟糕而且不再使用它。
不要使用它。