我只是感觉心情不错,可以比以前的评论者说更多的东西,因为前段时间我对所有这些按值传递引用的东西几乎同样头痛。所以:
Ruby 的变量实际上是对 Ruby 虚拟机中的底层对象的引用。它们被“按值”传递给函数,这意味着当你这样做时function(arg)
,function
实际上会获得对内存对象的引用副本。因此,function
获取对对象的有效引用,arg
以及引用的副本arg
。当您对引用的对象arg
或其副本执行某些操作时,您成功地直接修改了该对象。(但是当你直接对引用进行操作时,事情只会发生在引用上,因此,函数内部的复制引用甚至可能被删除,这不会影响原始引用或对象。考虑一下:
array_ref0 = [1,2,3] # actually, this reference represents array
array_ref1 = array_ref0
def f(arg); arg[0] = 0; end
f(array_ref0)
p array_ref0 # => [0,2,3]
p array_ref1 # => [0,2,3]
array_ref0 = [1,2,3]
p array_ref0 # => [1,2,3]
#but!
p array_ref1 # => [0,2,3]
那是因为说array_ref0 = [1,2,3]
你重新分配了一个新对象的引用,但是 array_ref1 仍然引用了旧对象,因为 >=1 引用了它的引用,所以它仍然存在(这里不再多谈 GC)
def g(arg); arg = nil; end
g(array_ref0)
p array_ref0 # => [1,2,3], because we only nil-ed copy of array_ref0.
希望清除一些东西。
我不是告诉你#dup 你的数组,因为以前的评论者给了你全面的实用答案。