Abflachen verstehe ich eine harte Zeit, warum dieses Stück Code funktioniert:ein Array rekursiv in Ruby
def flatten(array, result = [])
array.each do |element|
if element.is_a? Array
flatten(element, result)
else
result << element
end
end
result
end
Insbesondere, warum es ohne das Ergebnis des Flatten Methodenaufrufes zuweisen, die funktioniert der Ergebnis-Array, etwa so:
def flatten1(array, result = [])
array.each do |element|
if element.is_a? Array
result = flatten(element, result)
else
result << element
end
end
result
end
Beide produzieren den gleichen Ausgang:
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]
[Hier ist eine längere Diskussion] (http:
Eine idiomatische Ruby-Version wie folgt aussehen würde // stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value#10974116) und es gibt wahrscheinlich mehrere weitere auf der Website, aber kurze Antwort ist, dass die "Array-Ergebnis" an die Funktion übergeben Übergibt das tatsächliche Objekt, nicht eine Kopie davon, und das Objekt wird durch 'result << element' innerhalb der Funktionen modifiziert on, also wenn es rekursiv übergeben wird, wird es kontinuierlich ohne Neuzuweisung geändert –