Ein Codeblock oder Block ist eine Gruppe von null oder mehr Ausdrücken, die einen neuen Körper mit einem bestimmten Geltungsbereich einführt. (Ein Block mit null Ausdrücken wäre ein leerer Block und würde idealerweise nur als später auszufüllender Platzhalter verwendet.)
Codeblöcke können nur nach Bezeichnern erscheinen.
Geltungsbereich bezieht sich auf den Teil des Programms, in dem die Zuordnung eines Bezeichners (Name) zu einem Wert gültig ist und in dem dieser Name verwendet werden kann, um auf den Wert zu verweisen. Zum Beispiel existieren alle Konstanten oder Variablen, die du in einem Codeblock erstellst, nur im Kontext des Codeblocks. Das bedeutet, dass die Lebensdauer von Objekten auf den Geltungsbereich beschränkt ist, in dem sie erstellt werden, und sie können nicht außerhalb dieses Codeblocks verwendet werden.
Das folgende Beispiel zeigt, wie man die maximale Anzahl an Pfeilen berechnet, die man mit der Anzahl an Münzen kaufen kann, die der Spieler hat. Die Konstante MaxArrowsYouCanBuy wird innerhalb des if-Blocks erstellt, sodass der Geltungsbereich auf den if-Block beschränkt ist. Wenn die Konstante MaxArrowsYouCanBuy in dem Print-String verwendet wird, erzeugt sie einen Fehler, weil der Name MaxArrowsYouCanBuy außerhalb des if-Ausdrucks im Geltungsbereich nicht existiert.
CoinsPerQuiver : int = 100
ArrowsPerQuiver : int = 15
var Coins : int = 225
if (MaxQuiversYouCanBuy : int = Floor(Coins / CoinsPerQuiver)):
MaxArrowsYouCanBuy : int = MaxQuiversYouCanBuy * ArrowsPerQuiver
Print("Du kannst höchstens {MaxArrowsYouCanBuy} Pfeile mit deinen Münzen kaufen.“) # Fehler: Unbekannter Bezeichner MaxArrowsYouCanBuy
Verse unterstützt die Wiederverwendung eines Bezeichners nicht, auch wenn er in einem anderen Bereich deklariert ist, es sei denn, du kannst den Bezeichner qualifizieren, indem du (qualifying_scope:) vor dem Bezeichner hinzufügst, wobei qualifying_scope der Name des Moduls, der Klasse oder des Interfaces des Bezeichners ist. Wann immer du den Bezeichner definierst und verwendest, musst du an den Bezeichner auch einen Qualifizierer anhängen.
Weitere Details findest du unter Modul, Klasse und Schnittstelle.
Code-Blockformate
Codeblöcke haben in Verse drei mögliche Formate. Sie sind alle semantisch äquivalent, wodurch du den Stil eines Codeblocks ändern kannst, ohne damit zu ändern, was er tut.
Wenn du einen Codeblock innerhalb eines anderen Codeblocks verschachtelst, musst du trotzdem am Anfang des verschachtelten Codeblocks einen Bezeichner verwenden. Um den Code zu verschachteln, verwende den Ausdruck block.
Format mit Abstand
Bei diesem Format beginnt der Block mit :, wobei jeder nachfolgende Ausdruck in einer eigenen Zeile steht. Jede Zeile ist gleichmäßig um vier Leerzeichen eingerückt.
if (test-arg-block):
expression1
expression2
Beachte, dass if (test-arg-block) nicht Teil des Blocks ist, sondern der Block am Ende dieser Zeile mit : beginnt.
Du kannst auch ; verwenden, um mehrere Ausdrücke in einer einzigen Zeile zu trennen.
Mehrzeiliges Klammerformat
Der Block wird von {} umschlossen und Ausdrücke stehen in neuen Zeilen.
if (test-arg-block)
{
expression1
expression2
}
Du kannst auch ; verwenden, um mehrere Ausdrücke in einer einzigen Zeile zu trennen.
Einzeiliges Punktformat
Bei diesem Format beginnt der Block mit .. Jeder Ausdruck befindet sich in der gleichen Zeile und wird durch ein ; getrennt, statt in eine neue Zeile verschoben zu werden.
if (test-arg-block). expression1; expression2
Verwendest du das einzeilige Punktformat in einem if-Ausdruck, der ein else verwendet, kannst du nur einen Ausdruck vor dem else verwenden. Zum Beispiel:
if (test-arg-block). expression1 else. expression2