Ruby:数组是通过引用传递给函数的吗?

asd*_*fjk 0 ruby arrays pass-by-reference

我在下面有一个简单的代码

    def testarray
      arr_tree = [1,2,3,4,5]
      (1..3).each do |index|
        abcde(arr_tree)
        puts arr_tree[0]
      end
    end

    def abcde(node_tree)
      node_tree[0] += 100
    end
Run Code Online (Sandbox Code Playgroud)

所以在 testarray 函数中,我有一个arr_tree传递给函数的数组abcde。我在abcde函数内部更改数组的值并在内部打印数组testarray我在这里得到更改的值。所以输出是

101
201
301
Run Code Online (Sandbox Code Playgroud)

但我期待

1
1
1
Run Code Online (Sandbox Code Playgroud)

请解释为什么结果是这样?另外我怎样才能达到我的预期结果?

aku*_*uhn 6

在 Ruby 中,一切都“作为对象传递”。

数组是对象。

如果您想避免副作用,请复制参数

def abcde(node_tree)
  copy = node_tree.dup
  copy[0] += 100
  copy
end
Run Code Online (Sandbox Code Playgroud)

需要注意的是,由于您将变量命名为tree,因此该dup方法仅进行浅拷贝。浅意味着复制数组但不复制其元素。

为什么我上面没有说“通过引用传递”?

“通过引用传递”是另一种语言的概念,在 Ruby 上下文中没有意义。从技术上讲,Ruby 的本机实现使用按值传递,其中值是指向对象结构的指针。然而,认为 Ruby 使用“按值传递”是一种误导,因为它不会在将数据结构传递给函数之前创建数据结构的副本。这似乎是你认为会发生的事情......

  • 你们俩的观点已更新。 (2认同)