Standardwerte
Aus der Übung zu Parametern weißt du, dass ein fehlendes Argument nil ist. Oft gibt es einen Wert, der für die meisten Aufrufe passt, und nur ab und zu willst du einen anderen übergeben. Emma kauft zum Beispiel meistens einen Beutel Samen. Für solche Fälle bekommt der Parameter einen Standardwert. Lua hat keine eigene Schreibweise dafür, aber du kennst alles, was du brauchst, aus der Lektion über Bedingungen: x or standard.
local function kaufeSamen(pflanze, beutel)
beutel = beutel or 1
print("Samen: " .. pflanze .. ", Beutel: " .. beutel)
end
kaufeSamen("Karotten", 3)
kaufeSamen("Kürbis")Das gibt Folgendes aus:
Samen: Karotten, Beutel: 3
Samen: Kürbis, Beutel: 1Die erste Zeile des Rumpfs setzt den Standardwert ein. Wenn der Aufruf beutel übergibt, ist beutel or 1 diese Zahl. Wenn nicht, ist beutel gleich nil, und nil or 1 ist 1. Ein Aufruf kann Argumente nur am Ende weglassen, deshalb stehen Parameter mit Standardwert ganz hinten.
Viele andere Sprachen schreiben den Standardwert direkt in die Klammern: function kaufeSamen(pflanze, beutel = 1). Lua kennt das nicht, und so eine Zeile ist ein Syntaxfehler: ')' expected near '='.
Es gibt eine Falle. or ersetzt nicht nur nil, sondern auch false. Ist der Standardwert also true, kann der Aufrufer nicht false übergeben:
local function fuettern(tier, hungrig)
hungrig = hungrig or true
if hungrig then
print("Füttere " .. tier)
else
print(tier .. " hat keinen Hunger")
end
end
fuettern("Bella")
fuettern("Rex", false)Das gibt Folgendes aus:
Füttere Bella
Füttere RexRex hat keinen Hunger, aber false or true ist true. Es ist dieselbe Falle wie bei a and b or c in der Lektion über Bedingungen. Bei einem Parameter, der false sein kann, prüfst du stattdessen auf nil:
local function fuettern(tier, hungrig)
if hungrig == nil then
hungrig = true
end
if hungrig then
print("Füttere " .. tier)
else
print(tier .. " hat keinen Hunger")
end
end
fuettern("Bella")
fuettern("Rex", false)Das gibt Folgendes aus:
Füttere Bella
Rex hat keinen HungerJetzt bekommt nur ein fehlendes Argument (nil) den Standardwert, und false bleibt false. Für Zahlen und Texte reicht x or standard, weil sie nie false sind. Selbst 0 und "" bleiben, wie sie sind, denn in Lua zählen sie als wahr.
So schreibst du es:
Anweisungen
- 1
Der Samenhändler gibt Emma ab und zu einen Rabatt. Das Programm gibt
15aus und endet dann mit dem Fehlerattempt to perform arithmetic on a nil value (local 'rabatt'), weil der zweite Aufruf keinen Rabatt hat. Gibrabattden Standardwert0. Das Programm gibt dann15und12aus. - 2
Meistens kauft Emma nur einen Beutel. Gib
beutelden Standardwert1. Gib dann am Ende des ProgrammssamenKosten(4)aus, den Preis für einen Beutel Erdbeersamen. Das Programm gibt aus:15 12 4 - 3
Die Funktion
wasserBedarfgibt zurück, wie viele Eimer Wasser Emma für ihre Beete braucht: 2 pro Beet an einem sonnigen Tag, sonst 1 pro Beet. Die meisten Tage sind sonnig, deshalb sollsonnigden Standardwerttruehaben. Gib am Ende des ProgrammswasserBedarf(5),wasserBedarf(5, true)undwasserBedarf(5, false)aus, jeweils in einer eigenen Zeile. Die letzte gibt10aus, obwohl der Tag nicht sonnig ist. Behebe den Standardwert, damit die drei Zeilen10,10und5sind.