Blöcke

Bisher hast du dich bei der Programmierung in Lua absolut auf lineare Anwendungen, also Programme ohne irgendwelche Sprünge und Auslassungen, konzentriert. Ein Programm lebt aber davon, dass es interaktiv ist, und nicht nur der Reihe nach Text ausgibt. Dem wollen wir nur nun mehr und mehr Abhilfe schaffen. Um dem Programm "Interaktivität" zu verleihen, gibt es in der Lua-Syntax so allerhand Strukturen mit denen man beispielsweise Fallunterscheidungen, Auflistungen und Wiederholungen erzeugen kann. Diese Strukturen werden als "Schleifen" bezeichnet, eine bestimmte dieser Strukturen auch als "Block".

Ohne lange Erklärungen starten wir direkt mit der Implementierung der Block-Struktur, der so genannte "if-Block". Der "if-Block" stellt die Struktur der Fallunterscheidung dar und ermöglicht die Ausführung individueller Codeblöcke unter speziellen Bedingungen. Ein kleines Beispiel soll die Funktionsweise des "if-Blocks" veranschaulichen:

mampfi = 1
doppelmampfi = 2
 
ganz_was_anderes = "hi, wie gehts"
 
if mampfi == 1 then
  print(ganz_was_anderes.."? - sehr gut!")
end
if doppelmampfi == 2 then
  print(ganz_was_anderes.."? - "..mampfi.."a")
end

Ganz banal erscheint wieder die Ausgabe "hi, wie gehts? - sehr gut" und "hi, wie gehts? - 1a". Was passiert aber nun, wenn man "if mampfi == 1 then" zu "if mampfi == 2 then" ändert? Der Text "hi, wie gehts? - sehr gut" ist ganz plötzlich verschwunden. Und das aus einem sehr trivialen Grund. Die Struktur "if-Block" überprüft eine Bedingung auf ihren Wahrheitswert. Stimmt dieser Wahrheitswert, dann wird der interne Codeblock, in diesem Fall print(ganzwasanderes.."? - sehr gut!") ausgeführt. In letzterem fall müsste mampfi also wirklich dem Wert 2 entsprechen, um eine Ausgabe des Textes "hi, wie gehts? - sehr gut" zu ermöglichen. Die Bedingung eines if-blocks kann also folgendermaßen formuliert werden:

if mampfi == 1 then ...
if mampfi > 0 then ...
if mampfi < 2 then ...
if mapfi >= 1 then ...
if mampfi <= 1 then ...
if mampfi ~= 0 then ...
if not mampfi then ...
if mampfi then ...
if mampfi == 1 and brot >= 0 then ...
if mampfi <= 1 or (mampfi == 1 and brot >= 1 and wort == "hallo") then ...

Wie für Variablen gibt es auch für if-Blocks einige wichtige Operatoren. Man kann zwischen den folgenden Operatoren unterscheiden:

== ist der Vergleichsoperator und gibt einen gültigen Wahrheitswert zurück, falls die Variable mit dem Vergleichswert übereinstimmt

= ist der Operator für Größer-Gleich-Vergleiche und gibt einen gültigen Wahrheitswert zurück, falls die Variable größer oder gleich dem Vergleichswert ist <= ist der Operator für Kleiner-Gleich-Vergleiche und gibt einen gültigen Wahrheitswert zurück, falls die Variable kleiner oder gleich dem Vergleichswert ist ~= ist der Ungleichheitsoperator und gibt einen gültigen Wahrheitswert zurück, falls die Variable nicht mit dem Vergleichswert übereinstimmt not ist der Operator für die Existenzüberprüfung einer Varaible und gibt einen gültigen Wahrheitswert zurück, falls die Variable nicht existiert

Die Variable selbst als Bedingung gibt einen gültigen Wahrheitswert zurück, falls sie existiert. Die Vergleichswerte, also die Werte die rechts vom Operator stehen, können jeden Wert, wie er auch in einer Variablen gespeichert werden kann, annehmen. Ein if-Block kann neben einer verschachtelten Bedingungskomposition auch selbst einen komplexeren Bau beziehungsweise mehrfache Blöcke darstellen:

mampfi = 1
doppelmampfi = 2
 
ganz_was_anderes = "hi, wie gehts"
 
if mampfi == 1 then
  print(ganz_was_anderes.."? - sehr gut!")
elseif doppelmampfi == 2 then
  print(ganz_was_anderes.."? - "..mampfi.."a")
else
  print("weder mampfi noch doppelmampfi stimmen mit dem Vergleichswert überein!"
end

Mehrere if-Blöcke kann man also mit "elseif" verknüpfen. Mit "else" kann man einen alternativen Block erstellen, der ausgeführt wird, wenn die Variable mit dem Vergleichswert je nach Operator übereinstimmt beziehungsweise nicht übereinstimmt, wenn also der zurückgegebene Wahrheitswert des Operators falsch ist. Selbstverständlich kann man if-Blocks noch tiefer verschachteln, man kann in einen if-Block noch jede Menge weitere if-Blocks einbauen. Um Verwirrungen weitgehend auszuschliessen folgt nun noch eine Komplettübersicht über den Aufbau des if-Blocks:

if (not) variable (==/<=/>=/~=) (zeichenkette/zahl/variable) then
  --deine aktion
[elseif (not) variable (==/<=/>=/~=) (zeichenkette/zahl/variable) then
  --deine aktion]
[else
  --deine aktion]
end

Die Konstruktionen, die in eckige oder runde Klammern eingefasst sind, sind nicht zwingend erforderlich. Werden diese Konstruktionen weggelassen, bleibt die elementarste mögliche Struktur eines if-Blocks zurück. In der Regel wird aber weitaus mehr benötigt als nur diese elementare Struktur.

Categories

Tags