【发布时间】:2017-05-15 11:45:57
【问题描述】:
我很难理解为什么这段代码有效:
def flatten(array, result = [])
array.each do |element|
if element.is_a? Array
flatten(element, result)
else
result << element
end
end
result
end
特别是为什么不用将 flatten 方法调用的结果分配给结果数组就可以工作,像这样:
def flatten1(array, result = [])
array.each do |element|
if element.is_a? Array
result = flatten(element, result)
else
result << element
end
end
result
end
两者产生相同的输出:
p flatten [1,2,[3,4,[5,[6]]]] # [1, 2, 3, 4, 5, 6]
p flatten1 [1,2,[3,4,[5,[6]]]] # [1, 2, 3, 4, 5, 6]
【问题讨论】:
-
Here's a longer discussion 网站上可能还有更多,但简短的回答是,将
Array result传递给函数是传递实际对象,而不是它的副本,并且对象是由函数内的result << element修改,因此当递归传递时,它会不断修改而无需重新分配