当传递Ruby数组作为参数时,为什么`<<`追加而'+ =`不?

时间:2014-02-12 18:42:47

标签: ruby arrays

在将数组传递给函数以及<< vs +=的行为时,我遇到了意外的结果。

有人可以解释为什么以下两个程序有不同的输出吗?

def build_results
  result = []

  [1, 2, 3].each { |value| concat_to_array(value, result) }

  result
end

def concat_to_array(value, arr)
  arr << value
end

build_results() # Will return [1,2,3].  As I would expect.

VS

def build_results
  result = []

  [1, 2, 3].each { |value| add_to_array(value, result) }

  result
end

def add_to_array(value, arr)
  arr += [value]
end

build_results() # Will return [], not what I expected!

我的理解是,在Ruby中,所有函数参数都是通过引用传递的,因此arr += [value]仍应在传递的数组上运行并附加值。

事实并非如此,这告诉我在这种情况下我不理解+=<<之间的区别。

2 个答案:

答案 0 :(得分:10)

#<<#+之间的主要区别#<<只是Array的实例方法,因此您只需向指定实例添加值Array

arr = []
arr.__id__ # => 68916130
arr << 10
arr.__id__ # => 68916130

但是以#+的形式使用赋值运算符,它用新实例替换对变量的引用,并且新实例不应传递到#add_to_array函数的上层。

arr = []
arr.__id__ # => 68916130
arr += [10]
arr.__id__ # => 68725310

注意: +=隐含#+方法加赋值运算符=,但解释器将其视为特定运算符而不是一笔钱。

Additionals

表单arr = arr + [10]也无效。

def add_to_array(value, arr)
  arr = arr + [value]
end
build_results()
# => [] 

答案 1 :(得分:0)

  

我的理解是在Ruby中所有函数参数都通过引用传递

不,正如您自己发现的那样,Ruby是按值传递,而不是按引用传递。这就是你看到你所看到的结果的原因。