Tach!
ich habe ein Problem mit Variable Scope in Zusammenhang mit einer Rekursiven Funktion. Ich durchsuche rekursiv Unterverzeichnisse nach einer Datei und speichere bei einem Match den vollständigen Pfad in ein Array. Leider stehe ich ziemlich auf der Leitung, wenn ich das Ganze ohne globale Variable "matches" abbilden will.
Eine Funktion sollte selbständig arbeiten, nur Parameter entgegennehmen und ein Ergebnis liefern. Wenn sie außerhalb ihres Scopes etwas speichert ist sie nebenläufig. Das will man gern vermeiden.
Für die Rekursion kann man so vorgehen, dass am tiefsten Punkt die dortigen Ergebnisse zusammengetragen werden und als Funktionsergebnis zurückgeliefert werden. Als Parameter nimmt die Funktion in deinem Fall den Pfad entgegen. Eine Ebene weiter oben nimmt sie die Ergebnisse von den Unten-drunter-Aufrufen entgegen, fügt diese zusammen und fügt ihre eigenen Ergebnisse hinzu, und das ist das Rückgabeergebnis. Auch hier wieder den Pfad als Parameter übergeben. Die Sammelstelle ist dabei immer nur ein lokales Array (oder was auch immer). Und so setzt sich das bis nach oben fort. Natürlich ist der eigentliche Programmablauf genau umgekehrt als eben geschildert.
- A funktioniert nicht, weil ich durch die Rekursion, durch den erneuten Funktionsaufruf jedesmal eine neue, leere Variable matches habe. Is klar.
A funktioniert nicht, weil matches eine immer wieder neu angelegte lokale Variable ist und das Funktionsergebnis beim Auftauchen zwar zurückgegeben wird, aber dann ignoriert wird. Damit liefert nur der äußere Aufruf ein "flaches" Ergebnis.
- B funktioniert nicht, weil die Variable/Funktion "recursion" noch nicht definiert ist, wenn ich sie inmitten ihrer selbst abermals aufrufe. Is auch klar.
recursion ist keine Funktion sondern nimmt ein Funktionsergebnis auf. Die dortige Funktion wird nämlich gleich aufgerufen.
Die Frage, die bleibt ist: Wie macht man das richtig und in schön ? :)
Wie A, aber mit Beachtung der Rückgaben.
dedlfix.