Ruby传递参数:Array和Set之间的区别

时间:2014-04-23 21:29:09

标签: ruby pass-by-reference pass-by-value

我正在尝试将数组放到另一个现有数组中,而且还要将其所有项目放到现有的数组中。这是最小的例子:

require "set"

def add(myarr, bigarr, myset)
    bigarr << myarr
    myset |= Set.new(myarr)
end

bigarr = []
myset = Set.new

add([1, 2], bigarr, myset)

哪个会产生bigarr = [1, 2] ..好的,但是myset = {} ..是空的。我对在Ruby中传递参数知之甚少(应该是按值) - 在数组的情况下,值应该是对其内容的引用,那么我不知道set的值是什么。

问题是:

  1. 导致此行为的ArraySet之间的实质差异是什么?
  2. 有没有办法强制Ruby传递引用,或者有不同的推荐方法如何通过引用来解决问题?
  3. 提前致谢!

2 个答案:

答案 0 :(得分:1)

这与数组和集之间的差异没有任何关系。您正在使用<<方法修改数组,但是您正在使用myset运算符重新分配|=变量。你永远不会修改你传入的集合。你想要的可能是myset.merge(myarr)

答案 1 :(得分:1)

这里的问题实际上来自这个特定的行:

 myset |= Set.new(myarr)

在这里,您将在旧变量名称上创建新对象。您将一个指针替换为另一个指针,但这只会修改它的本地副本。原始对象仍然存在于内存和外部函数中,指针将指向旧对象(空集)(tbh:我不会真的鼓励这种带有副作用的ruby中的写法)。

如果您将其更改为

require "set"

def add(myarr, bigarr, myset)
    bigarr << myarr
    myset.add(myarr)
end

bigarr = []
myset = Set.new

add([1, 2], bigarr, myset)

它正常工作 - 因为您修改现有对象而不创建新对象。

这里有一个很好的答案,就在这里:https://stackoverflow.com/a/16464640/1975116