Lokale und globale Variablen
Seit der Lektion über Variablen schreibst du local vor jede Variable, und wir haben versprochen, dir den Grund zu erklären. Jetzt, wo du Funktionen schreibst, ist es so weit.
Jede lokale Variable hat einen Gültigkeitsbereich: den Teil des Programms, in dem sie existiert. Er beginnt in der Zeile, in der die Variable erstellt wird, und endet mit dem Block, in dem sie erstellt wurde: dem Rumpf einer Funktion, eines if oder einer Schleife oder dem ganzen Programm. Parameter sind lokale Variablen ihrer Funktion. Eine Variable, die in einer Funktion erstellt wird, existiert also außerhalb nicht:
local function zaehleEier()
local eier = 12
print("Im Stall: " .. eier)
end
zaehleEier()
print(eier)Das gibt Folgendes aus:
Im Stall: 12
nilAußerhalb der Funktion gibt es kein eier, deshalb gibt die letzte Zeile nil aus. Jeder Aufruf einer Funktion erstellt ihre lokalen Variablen neu, und sie verschwinden, wenn die Funktion endet. Das ist nützlich: Zwei Funktionen können jeweils ihre eigene Variable summe haben, und sie kommen sich nie in die Quere.
Umgekehrt sieht eine Funktion die lokalen Variablen, die oberhalb von ihr außerhalb der Funktion erstellt wurden, und sie kann sie sogar ändern:
local muenzen = 10
local function kaufeSamen(preis)
muenzen = muenzen - preis
end
kaufeSamen(3)
kaufeSamen(2)
print(muenzen)Das gibt Folgendes aus:
5Und was ist mit einer Variable ohne local? muenzen = 50 erstellt eine globale Variable. Eine globale Variable gehört zu keinem Block: Ab dem Moment, in dem sie erstellt wird, existiert sie überall, in jeder Funktion, bis das Programm endet. Auch Luas eigene print, math und table sind globale Variablen; deshalb kannst du sie überall benutzen. Wenn Lua keine lokale Variable mit einem Namen findet, sucht es eine globale, und wenn es auch keine gibt, ist der Wert nil. Darum bekamst du beim zu frühen Aufruf einer Funktion den Fehler attempt to call a nil value (global 'morgenAufgaben').
Globale Variablen wirken praktisch, verursachen aber Fehler, die schwer zu finden sind:
- Ein Tippfehler erstellt eine neue Variable. Weil eine Variable ohne
localerstellt werden kann, kann Lua einen Tippfehler nicht von einer neuen Variable unterscheiden.muenzne = muenzen + 5ist kein Fehler: Lua erstellt stillschweigend eine globale Variablemuenzne, undmuenzenändert sich nicht. - Alles kann sie ändern. Jede Funktion irgendwo im Programm kann eine globale Variable ändern. Ist ihr Wert falsch, musst du also das ganze Programm durchsuchen. Sogar
printlässt sich überschreiben: Nachprint = 5endet jedesprint(…)mit dem Fehlerattempt to call a number value (global 'print').
Am schlimmsten ist ein vergessenes local in einer Funktion:
local function verkaufeEier(eier)
muenzen = eier * 2
return muenzen
end
muenzen = 50
local verdient = verkaufeEier(10)
print("Verdient: " .. verdient)
print("Münzen: " .. muenzen)Das gibt Folgendes aus:
Verdient: 20
Münzen: 20Emma hatte 50 Münzen, und nach dem Verkauf der Eier hat sie 20? Die Funktion wollte eine eigene Variable, aber ohne local ist das muenzen in der Funktion dieselbe globale Variable wie außerhalb, und die Funktion hat sie überschrieben. Mit local muenzen = eier * 2 in der Funktion wären es zwei verschiedene Variablen, und Emma würde ihre Münzen behalten.
Deshalb schreibt dieser Kurs local vor jede Variable und jede Funktion (function verkaufeEier ohne local erstellt eine globale Funktion). Jede Variable existiert dann nur dort, wo sie gebraucht wird, und keine Funktion kann aus Versehen die Variablen einer anderen ändern. Werte gelangen über Parameter in eine Funktion und kommen mit return wieder heraus. Als Bonus findet Lua lokale Variablen schneller als globale. Denke nur daran, dass der Gültigkeitsbereich in der Zeile mit local beginnt: Eine Funktion kann nur lokale Variablen und lokale Funktionen benutzen, die oberhalb von ihr erstellt wurden.
So schreibst du es:
Anweisungen
- 1
Emmas Hühner haben jeden Tag Eier gelegt, aber das Programm gibt
Eier diese Woche: 0aus. InzaehleEierhat ein Variablenname einen Tippfehler. Lua hat ihn nicht gemeldet: Es hat stillschweigend eine globale Variable erstellt. Finde den Tippfehler und behebe ihn. Das Programm gibt dannEier diese Woche: 49aus. - 2
Jetzt gibt das Programm
Verdient: 98 MünzenundMünzen: 196aus. Aber Emma hatte 50 Münzen, also sollte sie 148 haben. Die VariablemuenzeninverkaufeEierhat keinlocal, deshalb überschreibt die Funktion Emmasmuenzenvom Anfang des Programms. Behebe die Funktion, sodass sie eine eigene lokale Variable benutzt. Das Programm gibt dann Folgendes aus:Eier diese Woche: 49 Verdient: 98 Münzen Münzen: 148 - 3
Die Funktion
verkaufeEierselbst ist noch global. Mache sie lokal, wiezaehleEier. Das Programm gibt dasselbe aus.