0
我有一個很難理解爲什麼這段代碼工作遞歸扁平化的數組:在Ruby中
def flatten(array, result = [])
array.each do |element|
if element.is_a? Array
flatten(element, result)
else
result << element
end
end
result
end
特別是,爲什麼它工作,而無需指定扁平化方法調用的結果結果數組,像這樣:
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]
[這裏有一個較長的討論(HTTP:// stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value#10974116),網站上可能還有更多,但簡短的答案是將'Array result'傳遞給函數正在傳遞實際的對象,而不是它的副本,並且該對象由函數內的'result << element'修改所以當遞歸傳遞時,它不斷地被修改而不需要重新分配 –