繁体   English   中英

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

[英]When passing a Ruby array as an argument, why does `<<` append while `+=` does not?

将数组传递给函数和<< 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.

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]仍应在传递的数组上进行操作并附加该值。

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

之间的主要区别#<< ,和#+ s表示#<<只是Array的实例方法,所以你只要将值添加到的指定实例Array

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

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

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

注意: +=表示#+方法加上赋值运算符= ,但是解释器将其视为特定的运算符而不是总和。

附加项

格式arr = arr + [10]也不正确。

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

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

不,就像您发现自己一样,Ruby是按值传递的,而不是按引用传递的。 这就是为什么您看到看到的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM