Rekursive Funktion gibt nil statt Wert zurück
Hallo zusammen,
ich bin blutiger Lua Anfänger, habe zwar grundlegende Programmierkenntnisse aus c perl oder java..
ich hab ein Problem mit meiner rekursiven Funktion.
ich übergebe der search funktion eine table und einen sting mit einem blätter-pfad und möchte das Element/sub-table zurückbekommen welche ich anfrage.
Code:
--
function search(tab, str)
local a, b, c = string.match(str, '(%w+)(%.([%w%.]+))')
if(a == nil) then
print(tab[str]) -- "101"
return (tab[str])
else
search(tab[a],c)
end
end
local t = {["foo"] = {
["bar"] = {
["hallo"] = "101"
}
}
}
local string = "foo.bar.hallo"
local result = search(t,string)
print(result) -- "nil"
Für jeden Knoten (getrennt durch "." im String) wird rekursiv eine Ebene tiefer in die Table gewechselt bis das letzte Element/sub-table gefunden wurde und dieses zurückgegeben wird.
Innerhalb der search Funktion ist die Ausgabe auch korrekt.
Allerdings wird beim return das Ergebnis nicht übernommen so das nil in der Ausgabe erscheint :/
Gebe ich nur "foo" als string ein, funktioniert die Rückgabe und ich bekomme die sub-table korrekt zurück :shock:
Daher denke ich es liegt an der Rekursion bzw dem Call-by-reference, leider kenne ich mich zu wenig in lua aus um das Problem selbst zu lösen :(
Ich danke euch schon mal im Voraus für die Hilfe und Bemühungen.
Gruß
MegaChroniX
Zum Hintergrund:
Ich möchte eine einfache Internationalisierung bauen, über welche mit translate("foo.bar") ein bestimmtes Label zurückgegeben wird.
Die Label sollen in einer table gespeichert werden
AW: Rekursive Funktion gibt nil statt Wert zurück
Bei der Zuweisung
Code:
local a, b, c = string.match(str, '(%w+)(%.([%w%.]+))')
bekommt nur a den Wert. b und c sind nil. Ist das gewollt?
AW: Rekursive Funktion gibt nil statt Wert zurück
Zitat:
Zitat von
Scarecrow
Bei der Zuweisung
Code:
local a, b, c = string.match(str, '(%w+)(%.([%w%.]+))')
bekommt nur a den Wert. b und c sind nil. Ist das gewollt?
ja ist gewollt, die pattern suchen nach einem string in dem ein oder mehrere punkte vorkommen und zerteilen ihm am ersten punkt.
ist nur ein "knoten" ohne punkt gegeben sind a,b,c nil da nicht gematched wird.
das ist dann die abbruchbedingung für die funktion und man hat den letzten "knoten" erreicht.
es sollten dadurch (hoffe) alle möglichen längen abgedeckt werden
von
foo
foo.bar
foo.bar.hallo ...[...] usw. je nachdem wie tief die table ist
EDIT:
die Antwort ist genau so dämlich wie simplel...
Code:
if(a == nil) then
print(tab[str]) -- "101"
return (tab[str])
else
return search(tab[a],c)
end
ich hab ein return vergessen xD
AW: Rekursive Funktion gibt nil statt Wert zurück
Ouha :D
Benutzt du eine IDE oder mehr sowas wie Notepad++ zum Schreiben deiner Scripts?
AW: Rekursive Funktion gibt nil statt Wert zurück
AW: Rekursive Funktion gibt nil statt Wert zurück
Den hab ich auch so schnell nicht gesehen. :D
Das schlimme daran ist ja, das alle gängigen LUA-Interpreter dir auch keinen Fehler melden würden. Es ist in LUA halt möglich Funktionen zu schreiben die nicht auf allen möglichen wegen einen Wert zurückgeben.