Entwicklung / ROBLOX
Luau-Funktionen: Parameter, return und Ergebnisse prüfen
Lerne, einen Funktionswert zu erhalten, return von print zu unterscheiden und Eingaben zu prüfen. Eine eigene Übung berechnet verbleibende Wegstationen mit ausführbaren Beispielen und Grenzfällen.
Bestimme zuerst die Frage #
Stelle dir einen Übungsweg mit zehn Stationen vor. Bekannt sind die Gesamtzahl und die Anzahl besuchter Stationen. Gesucht ist die verbleibende Anzahl. Die Funktion beantwortet nur eine Rechenfrage: visited von total abziehen. Sie bewegt keine Figur, liest keine gespeicherten Fortschritte und bestätigt keinen tatsächlichen Stationsbesuch.
Notiere die Bedeutung der Eingaben: total ist die Gesamtzahl, visited die besuchte Anzahl. Für diese Übung gelten nichtnegative ganze Zahlen und visited darf total nicht überschreiten. Das ist eine Vereinbarung für das Beispiel, kein allgemeines Modell für jedes Roblox-Spiel. Damit lässt sich unterscheiden, ob eine falsche Erwartung, eine Eingabe oder die Rechnung verantwortlich ist.
Definiere und rufe die Funktion auf #
Das erste Beispiel definiert local function remainingStops(total, visited). Zwischen dieser Zeile und end steht der Funktionskörper. return gibt die berechnete Differenz an den aufrufenden Code zurück. Die Definition allein führt die Rechnung noch nicht aus. Erst remainingStops(10, 3) startet sie mit zwei Argumenten.
Zwei Aufrufe speichern Ergebnisse in getrennten Variablen. Zehn Stationen mit drei besuchten ergeben 7; mit sechs besuchten ergeben sie 4. Anschließend zeigt print die gespeicherten Zahlen. Führe den vollständigen Block in einem eigenen Übungs-Script aus und vergleiche beide Output-Zeilen. Die Beispiele wurden außerdem mit einem eigenständigen Luau-Interpreter ausgeführt; das prüft Sprache und Rechnung, keine spielbare Strecke in Studio.
local function remainingStops(total, visited)
return total - visited
end
local firstRemaining = remainingStops(10, 3)
local secondRemaining = remainingStops(10, 6)
print(firstRemaining)
print(secondRemaining)Unterscheide Parameter und Argumente #
total und visited sind Parameternamen innerhalb der Funktion. Die Zahlen 10 und 3 sind Argumente eines bestimmten Aufrufs. Beim nächsten Aufruf erhalten dieselben Parameter andere Werte. Eine äußere Variable darf routeLength heißen: Entscheidend ist, dass ihr Wert der vereinbarten Bedeutung von total entspricht.
Die Reihenfolge zählt. remainingStops(10, 3) und remainingStops(3, 10) verwenden unterschiedliche Eingaben. Die einfache Funktion prüft deren Bedeutung nicht und berechnet beim zweiten Aufruf eine negative Zahl. Eine andere Ausgabebeschriftung behebt das nicht. Vergleiche zuerst Reihenfolge und Werte mit der Eingabevereinbarung und ergänze danach die Prüfung.
Beobachte print ohne return #
Im zweiten Beispiel gibt showRemaining die Differenz im Funktionskörper aus. Mit 10 und 3 erscheint tatsächlich 7 in Output. Die Funktion gibt jedoch keinen Wert ausdrücklich zurück. Die Variable result im aufrufenden Code erhält nil. Deshalb zeigt das anschließende print(result) nil statt einer weiteren Sieben.
Eine richtige Output-Zeile beweist also nicht, dass der Aufrufer die gewünschte Zahl erhalten hat. Benötigt späterer Code den Wert, muss die Rechnung ihn zurückgeben. Lasse zum Lernen beide print-Aufrufe stehen: zuerst die Zahl aus der Funktion, dann nil beim Aufrufer. Eine feste Sieben einzusetzen verdeckt den Fehler und funktioniert nicht für andere Eingaben.
local function showRemaining(total, visited)
print(total - visited)
end
local result = showRemaining(10, 3)
print(result)Speichere das Ergebnis am passenden Ort #
Im ersten Beispiel enthalten firstRemaining und secondRemaining zurückgegebene Zahlen. Der aufrufende Code kann sie vergleichen, weiterreichen oder anzeigen. Berechnung und Darstellung sind damit getrennte Schritte. Eine lokale Variable genügt zum Verständnis von return; eine Benutzeroberfläche ist für diese Übung nicht erforderlich.
return beendet die Ausführung des betreffenden Funktionszweigs. Eine Rechnung danach im selben Zweig verändert den zurückgegebenen Wert nicht. Luau unterstützt außerdem mehrere Rückgabewerte, getrennt durch Kommas. Die geprüfte Variante verwendet ein Paar aus Ergebnis und Gültigkeitsmerkmal. So wird ein fehlendes Ergebnis von einer erfolgreich beendeten Rechnung unterschieden.
Prüfe Eingaben vor der Subtraktion #
checkedRemaining prüft zuerst die Typen. Fehlt visited, erhält der Parameter nil; die Funktion liefert nil, false vor der Rechnung. Auch die Zeichenkette "10" wird abgelehnt: Das Beispiel akzeptiert Zahlen und wertet keine Texteingabe aus. Danach werden NaN und positive Unendlichkeit ausgeschlossen; negative Werte einschließlich negativer Unendlichkeit scheitern an der Negativprüfung.
Die Restprüfung bei Division durch 1 lehnt Bruchteile ab. Das letzte Kriterium verhindert visited größer als total. Erst zulässige Eingaben erreichen return total - visited, true. Die Reihenfolge macht die Regeln nachvollziehbar. Sie schützt diese Übungsrechnung, beweist aber nicht, dass eine vom Client gelieferte Zahl tatsächlichen Spielerfortschritt beschreibt.
local function checkedRemaining(total, visited)
if type(total) ~= "number" or type(visited) ~= "number" then
return nil, false
end
if total ~= total or visited ~= visited then
return nil, false
end
if total == math.huge or visited == math.huge then
return nil, false
end
if total < 0 or visited < 0 or total % 1 ~= 0 or visited % 1 ~= 0 then
return nil, false
end
if visited > total then
return nil, false
end
return total - visited, true
end
print(checkedRemaining(10, 3))
print(checkedRemaining(10))
print(checkedRemaining(10, 12))Prüfe fehlenden und zu großen Fortschritt #
Der Block enthält drei Aufrufe. checkedRemaining(10, 3) zeigt 7 und true. checkedRemaining(10) zeigt nil und false, weil das zweite Argument fehlt. checkedRemaining(10, 12) zeigt ebenfalls nil und false: Zwölf besuchte Stationen passen nach unserer Regel nicht zu zehn Stationen insgesamt.
Speichere das Paar mit local value, valid = checkedRemaining(total, visited). Prüfe valid == true, bevor die Zahl angezeigt wird. Bei false ist eine verständliche Meldung über ungültige Daten sinnvoll. nil automatisch in null umzuwandeln würde den Fehler verstecken und wie ein abgeschlossener Weg wirken. Korrigiere stattdessen die Eingabe an ihrer Quelle.
Erkenne null als gültiges Ergebnis #
checkedRemaining(10, 10) liefert 0, true: Alle zehn Stationen sind besucht. Auch der leere Übungsweg checkedRemaining(0, 0) liefert 0, true. Das sind erfolgreiche Berechnungen. nil, false bedeutet dagegen, dass die Eingaben abgelehnt wurden und kein Ergebnis vorliegt.
Null gilt in Luau als wahrer Wert in Bedingungen. Trotzdem erklärt valid == true die Vereinbarung dieser Funktion deutlicher. Nur value > 0 zu prüfen würde ein korrektes Nullergebnis ausschließen. Ein echtes Abschlussverhalten gehört hinter die Gültigkeitsprüfung und setzt ein Spielsystem voraus, das tatsächlich dieses Modell verwendet.
Teste auch die Grenzen #
Erstelle eine Tabelle: 10 und 3 ergeben 7, 10 und 0 ergeben 10, 10 und 10 ergeben 0, 0 und 0 ergeben 0. Für alle Fälle erwartest du true. Separat stehen ungültige Eingaben: fehlendes Argument, Zeichenkette, negative Zahl, Bruchteil und visited über total. Erwartet werden nil und false.
Die zugehörige Prüfdatei führte diese Fälle mit assert aus und prüfte zusätzlich NaN sowie Unendlichkeit. Notiere Erwartungen vor dem Lauf und vergleiche anschließend die tatsächlichen Wertepaare. Bei Abweichungen nenne die konkrete Eingabe und das beobachtete Paar. Eine richtige Rechnung prüft weder Speicherung noch Client-Vertrauen oder Belohnungen.
| Eingabe total / visited | Erwartetes Ergebnis |
|---|---|
| 10 / 3 | 7, true |
| 10 / 10 | 0, true |
| 0 / 0 | 0, true |
| 10 / zweites Argument fehlt | nil, false |
Übergib die Vereinbarung mit dem Code #
Bewahre Funktionsname, Bedeutung und Reihenfolge der Parameter, erlaubte Eingaben, Rückgabepaar und Prüftabelle für die nächste entwickelnde Person auf. Kennzeichne den Code als eigenes Beispiel auf reinem Luau. Beim Anschluss eines echten Wegs muss separat festgelegt werden, woher der Server bestätigte total- und visited-Werte erhält und wie fehlende Daten behandelt werden.
Das Beispiel enthält keine Roblox-Objekte, Ereignisse, Netzwerkkommunikation oder dauerhafte Speicherung und ist keine fertige Fortschrittsverwaltung. Sein Nutzen liegt darin, eine Output-Meldung vom Ergebnis für den Aufrufer zu unterscheiden und dies mit verständlichen Eingaben zu überprüfen. Darauf kann die nächste Aufgabe mit derselben geprüften Vereinbarung aufbauen.
| Feld | Aufbewahren |
|---|---|
| Parameter | Gesamtzahl und besuchte Anzahl |
| Regeln | Endliche nichtnegative ganze Zahlen |
| Ergebnis | Zahl und separates Merkmal valid |
| Prüfungen | Normale Eingaben und Grenzfälle |