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.