在将数组传递给函数以及<<
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]
仍应在传递的数组上运行并附加值。
事实并非如此,这告诉我在这种情况下我不理解+=
和<<
之间的区别。
答案 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
注意: +=
隐含#+
方法加赋值运算符=
,但ruby解释器将其视为特定运算符而不是一笔钱。
表单arr = arr + [10]
也无效。
def add_to_array(value, arr)
arr = arr + [value]
end
build_results()
# => []
答案 1 :(得分:0)
我的理解是在Ruby中所有函数参数都通过引用传递
不,正如您自己发现的那样,Ruby是按值传递,而不是按引用传递。这就是你看到你所看到的结果的原因。