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

Mat*_*mer 1 ruby arrays

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

任何人都可以解释为什么以下2个程序有不同的输出?

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.
Run Code Online (Sandbox Code Playgroud)

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!
Run Code Online (Sandbox Code Playgroud)

我的理解是,在Ruby中,所有函数参数都是通过引用传递的,因此arr += [value]仍然应该对传递的数组进行操作并附加值.

情况并非如此,这告诉我我不理解+=<<在这种情况下的区别.

Мал*_*евъ 10

#<<#+s 之间的主要区别#<<只是Array实例方法,所以你只需要为指定的实例添加一个值Array

arr = []
arr.__id__ # => 68916130
arr << 10
arr.__id__ # => 68916130
Run Code Online (Sandbox Code Playgroud)

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

arr = []
arr.__id__ # => 68916130
arr += [10]
arr.__id__ # => 68725310
Run Code Online (Sandbox Code Playgroud)

注意:+=意味着#+方法加赋值运算符=,但是解释器将其视为特定运算符而不是总和.

Additionals

表格arr = arr + [10]也不正常.

def add_to_array(value, arr)
  arr = arr + [value]
end
build_results()
# => [] 
Run Code Online (Sandbox Code Playgroud)