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_1
和 a
)都指向的对象的值。
在 method_2
中,您将一个全新的对象重新分配给两个变量之一 (a
)。
Why input_1
changes whereas input_2
doesn't change?
这个问题的非常简单的答案是你的前提是错误的。 input_1
不变。 input_1
引用 的对象发生了变化,但那是与input_1
完全不同 的对象。事物的名称与事物本身不相同。 (巫术之外。)
在下文中,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_1
和 a
)都指向的对象的值。
在 method_2
中,您将一个全新的对象重新分配给两个变量之一 (a
)。
Why
input_1
changes whereasinput_2
doesn't change?
这个问题的非常简单的答案是你的前提是错误的。 input_1
不变。 input_1
引用 的对象发生了变化,但那是与input_1
完全不同 的对象。事物的名称与事物本身不相同。 (巫术之外。)