Ruby 方法内部的数组操作

Ruby array manipulation inside method

在下文中,input_1 更改:

def method_1(a)
  a << "new value"
end

input_1 = []
method_1(input_1)
input_1 #=> ["new value"]

以下,input_2不变:

def method_2(a)
  a = ["new value"]
end

input_2 = []
method_2(input_2)
input_2 #=> []

为什么 input_1 改变而 input_2 没有改变?

稍微简化一下,我们可以说 Ruby 中的变量是对值的引用。在您的情况下,变量 a 包含对数组的引用。

a << (a.append) 改变存储在变量 a 中的 value。引用没有改变,但值改变了。这是 method_1

的情况
def method_1(a)
    a << "new value"
end

赋值 = 更改存储在变量中的引用 - 它开始指向不同的值。引用在传递给方法时被复制。因为当你打电话给

def method_2(a)
    a = ["new value"]
end
input = []
method_2(a)

您只更改存储在 a 中的方法本地引用,而不更改存储在 input 中的引用或值(和 [] 的数组) 此引用指向。

归结为 Ruby 使用 "pass-reference-by-value"。

您遇到的确切情况在 this excellent blog post 中有描述。

要点:

method_1 中,您正在更改两个不同变量(input_1a)都指向的对象的值。

method_2 中,您将一个全新的对象重新分配给两个变量之一 (a)。

Why input_1 changes whereas input_2 doesn't change?

这个问题的非常简单的答案是你的前提是错误的。 input_1 不变。 input_1 引用 的对象发生了变化,但那是input_1 完全不同 的对象。事物的名称与事物本身相同。 (巫术之外。)