Standardwerte
and und or können mehr, als Bedingungen zu verbinden. Sie ergeben nicht nur true oder false: Sie liefern einen ihrer beiden Werte. a or b liefert a, wenn a als wahr zählt, und sonst b:
print(nil or "Freund")
print("Emma" or "Freund")
print(0 or 12)Das gibt Folgendes aus:
Freund
Emma
0Damit ist or ideal für einen Standardwert: einen Wert, der benutzt wird, wenn eine Variable nil ist. Der Händler Hugo nennt Emma vielleicht seinen Preis für einen Kürbis, vielleicht auch nicht:
local hugoPreis
local preis = hugoPreis or 20
print("Preis für einen Kürbis: " .. preis)Das gibt Folgendes aus:
Preis für einen Kürbis: 20hugoPreis ist nil, also bekommt preis den Standardwert, 20. Hätte Hugo 25 gesagt, wäre preis gleich 25. Lies es als „Hugos Preis, oder sonst 20“. Aber denke an die letzte Zeile des ersten Beispiels: or ersetzt nur nil und false. 0 zählt als wahr, also ist 0 or 12 gleich 0.
Lua rechnet or zuletzt, nach allen anderen Operatoren, .. eingeschlossen. Setze es in einem längeren Ausdruck in Klammern: "Preis: " .. (hugoPreis or 20). Ohne sie versucht "Preis: " .. hugoPreis or 20 zuerst, den Text mit nil zu verbinden, und endet mit dem Fehler attempt to concatenate a nil value (local 'hugoPreis').
a and b funktioniert umgekehrt: Wenn a als falsch zählt, liefert es a, sonst b. Zusammen liefert bedingung and x or y den Wert x, wenn die Bedingung wahr ist, und y, wenn nicht, wie ein kleines if mit else in einer Zeile:
local eier = 14
local schachtel = eier >= 12 and "eine volle Schachtel" or "eine halbe Schachtel"
print("Emma packt " .. schachtel)Das gibt Folgendes aus:
Emma packt eine volle SchachtelDer Vergleich ist wahr, also liefert eier >= 12 and "eine volle Schachtel" den Wert "eine volle Schachtel", und "eine volle Schachtel" or "eine halbe Schachtel" liefert "eine volle Schachtel", weil ein Text als wahr zählt. Bei 8 Eiern würde der Vergleich false ergeben, false and … würde false liefern, und false or "eine halbe Schachtel" würde "eine halbe Schachtel" liefern.
Dieser Trick scheitert, wenn der Wert in der Mitte false oder nil ist:
local regnet = true
local brauchtWasser = regnet and false or true
print(brauchtWasser)Das gibt Folgendes aus:
trueEs regnet, das Feld sollte also kein Wasser brauchen. Aber regnet and false liefert false, und false or true liefert true. Benutze bedingung and x or y nur, wenn x nicht false oder nil sein kann, zum Beispiel ein Text oder eine Zahl. Sonst schreibe ein if mit else (oder hier einfach not regnet).
So schreibst du es:
Anweisungen
- 1
Führe das Programm aus: Es endet mit einem Fehler, weil
kundegleichnilist. Benutzeor, damit das Programm einen Kunden ohne Namen mitFreundbedankt. Das Programm gibt dann Folgendes aus:Eier: 6 Danke, Freund! - 2
Ein Ei kostet 3 Münzen, aber ein Kunde, der 10 oder mehr Eier kauft, zahlt nur 2 Münzen pro Ei. Erzeuge zwischen den beiden
print-Zeilen eine lokale VariablepreisProEi, die2ist, wenneiermindestens10ist, und sonst3. Schreibe sie in einer Zeile mitandundor. Gib dann den Preis für alle Eier aus. Das Programm gibt Folgendes aus:Eier: 6 Preis: 18 Münzen Danke, Freund! - 3
Opa Josef kommt, um 10 Eier zu kaufen: Ändere
kundein"Opa Josef"undeierin10. Das Programm gibt Folgendes aus:Eier: 10 Preis: 20 Münzen Danke, Opa Josef!