对象#轻敲问题

时间:2011-01-28 10:43:46

标签: ruby-on-rails ruby

为什么

a = [].tap do |x|
  x << 1
end
puts "a: #{a}"

按预期工作

a: [1]

b = [].tap do |x|
  x = [1]
end
puts "b: #{b}"

b: []

3 个答案:

答案 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代码中使用它的人现在承认它很糟糕而且不再使用它。

不要使用它。