Variablen
Variablen sind Behälter, in denen Werte abgelegt werden können. Ihre Namen unterliegen den Regeln der Bezeichner.
Man kann Variablen Werte zuweisen:
a = 1 print(a) -- -> 1
Wird eine nicht intialisierte Variable verwendet, so wird ein spezieller Wert zurückgegeben, Nil:
print(b) -- -> nil
Um eine Variable wieder zu löschen, kann man ihr wiederum den Wert nil zuweisen:
a = nil print(a) -- -> nil
Sichtbarkeit von Variablen
1) Variablen sind ohne ausdrückliche Deklaration (der 4. Typ Anweisung) immer global. Meist reicht das auch für die Bedürfnisse eines Mappers völlig aus.
Wenn es aber globale Variablen gibt, so muss es auch entsprechend lokale Variablen geben. Diese sind nur immer innerhalb des Blockes, in dem sie deklariert wurden, gültig.
Erklärung Block in Tutorials noch einfügen. Solange kann man sich das hier ansehen:Externer Link
local deklariert.
Wozu sollte man lokale Variablen verwenden? Es kann sein, dass man bestimmte Werte nur in einem bestimmten Abschnitt benötigt und danach diese einfach nicht mehr notwendig sind. Man könnte sie also „wegwerfen“, wenn man wollte. Genau das passiert mit lokalen Variablen, während globale Variablen, ohne ausdrückliche Löschung, „für die Ewigkeit“ (bzw. bis zum Ende des Spiels) bestimmt sind.
Nun könnte es passieren, dass man aus Versehen den bestehenden Wert einer globalen Variable überschreibt, obwohl man den alten Wert eigentlich noch benötigt, oder durch einen Tippfehler wird aus Versehen der Wert einer falschen globalen Variable verwendet.
Hier ein kleines Beispiel:
function MachWas( Var1 ) print( Var1 ); end function f1() Var1 = "In Funktion 1 gesetzt"; MachWas( "f1:" .. Var1 ); end function f2() Var1 = "Das hier kommt von Funktion 2"; MachWas( "f2:" .. Var1 ); end function f3() MachWas( "f3:" .. Var1 ); end
Zunächst wird eine Funktion zur Ausgabe deklariert und zwei weitere Funktionen, die einer Variablen einen Wert zuweisen und diese zusammen mit dem eigenen Namen ausgeben. Die vierte Funktion gibt nur den aktuellen Wert der globalen Variable zusammen mit dem eigenen Namen aus. Ruft man die Funktionen nun in dieser Reihenfolge auf:
f2(); f1(); f3();
Erhält man die Ausgabe:
f2:Das hier kommt von Funktion 2 f1:In Funktion 1 gesetzt f3:In Funktion 1 gesetzt
Ändert man nun die Aufrufreihenfolge in…
f1(); f2(); f3();
…sieht man, daß f3 nun einen anderen Wert ausgibt. Das ist vielleicht gar nicht gewollt?
f1:In Funktion 1 gesetzt f2:Das hier kommt von Funktion 2 f3:Das hier kommt von Funktion 2
Der Effekt entsteht dadurch, dass mit globalen Variablen gearbeitet wird. Die Funktionen können sich also gegenseitig beeinflussen. Wenn man nun in f2 eine lokale Variable deklariert, bleibt das Ergebnis wie im ersten Beispiel mit der Reihenfolge “2, 1, 3”, obwohl hier auch “1, 2, 3” verwendet wird.
function f2() local Var1 = "Das hier kommt von Funktion 2"; MachWas( "f2:" .. Var1 ); end
f1:In Funktion 1 gesetzt f2:Das hier kommt von Funktion 2 f3:In Funktion 1 gesetzt
Der von f1 gesetzte Wert wird also beim Aufruf von f2 nicht überschrieben.
Eine lokale Variable gilt immer nur bis zum end des Blockes in dem sie mit local deklariert wurde. Das muss nicht unbedingt das nächste end sein, da ja auch verschachtelte Blöcke verwendet werden können.
Wenn man eine Variable später nicht mehr benötigt, sollte man sie also als local deklarieren.
Hier ein Beispiel, welches so nicht funktioniert:
if Regen() then local WasMachIchNur = "Wäsche reinholen"; end print( WasMachIchNur );
In der print Zeile wird nicht “Wäsche reinholen” ausgegeben. Die Variable “WasMachIchNur” wurde lokal deklariert. Ihr Block (Gültigkeitsbereich) endet aber schon eine Zeile später. Somit ist sie eine weitere Zeile später für das print() nicht mehr verfügbar. Umgehen kann man dies, indem man sie außerhalb des Blocks (also im umgebenden Block) lokal deklariert:
local WasMachIchNur; if Regen() then WasMachIchNur = "Wäsche reinholen"; end print( WasMachIchNur );
Nun wird korrekt “Wäsche reinholen” ausgegeben. Wie man hier sieht, beendet das “end” nicht den Wirkungsbereich der Variable, da das “end” zum “if” gehört, die Variable aber außerhalb dieses Blocks deklariert wurde. Weiterhin braucht man nur bei der ersten Verwendung der Variable in einem Block, also der Deklaration das “local” davor schreiben. Denn würde man es so machen:
local WasMachIchNur; if Regen() then local WasMachIchNur = "Wäsche reinholen"; end print( WasMachIchNur );
..würde es nicht funktionieren. Denn dann hat man die lokale Variable “WasMachIchNur” im übergeordneten Block, und eine weitere lokale “WasMachIchNur” Variable im “if” “end” Block. Nur der “inneren” wird der Wert zugewiesen. Der äußeren Variable steht daher nach dem Ende des Gültigkeitsbereichs der inneren Variable kein Wert mehr zur Verfügung.
local foo = foo
Hierbei wird auf die globale Variable foo zugegriffen und in die lokale Variable übertragen. Das bedeutet: Die lokale Variable foo wird erst nach der Zuweisung deklariert.




