コード ブロック またはブロックは、新しい スコープが設定された 本体 を導入する 0 個以上の 式 のグループです(式が 0 個のブロックは空ブロックであり、理想的には後で入力されるプレースホルダーとしてのみ使用されます)。
コード ブロックは、識別子 の後にしか入れることができません。
スコープ とは、プログラムの中で識別子 (名前) と 値 の関連付けが有効な部分と名前を値の参照に使用できる部分のことです。たとえば、コード ブロック内で作成する 定数 や 変数 はコード ブロックのコンテキスト内のみに存在します。つまり、オブジェクトの ライフタイム は、それらのオブジェクトが作成され、そのコード ブロックの外部では使用できないスコープに限定されます。
次の例は、プレイヤーが持つコインの数で購入できる矢の最大数を計算する方法を示しています。定数 MaxArrowsYouCanBuy
は if
ブロック内で作成されているため、そのスコープは if
ブロックに限定されます。Print String で定数 MaxArrowsYouCanBuy
を使用すると、if
式の外側のスコープに名前 MaxArrowsYouCanBuy
がないため、エラーが生成されます。
CoinsPerQuiver : int = 100
ArrowsPerQuiver : int = 15
var Coins : int = 225
if (MaxQuiversYouCanBuy : int = Floor(Coins / CoinsPerQuiver)):
MaxArrowsYouCanBuy : int = MaxQuiversYouCanBuy * ArrowsPerQuiver
Print("You can buy at most {MaxArrowsYouCanBuy} arrows with your coins.")# エラー:不明な識別子 MaxArrowsYouCanBuy
Verse では、別のスコープで宣言されていたとしても識別子を再利用できません。ただし、qualifying_scope が識別子のモジュール、クラス、またはインターフェースの名前であり、識別子の前に (qualifying_scope:)
を追加して識別子を 修飾 できる場合を除きます。識別子を定義して使用するときは、必ず識別子に修飾子を追加する必要もあります。
詳細については、「モジュール」、「クラス」、「インターフェース」を参照してください。
コード ブロックの形式
Verse のコード ブロックには 3 つの形式がありますが、それらはすべて 意味的に 同じであるため、機能を変えることなくコード ブロックのスタイルを変更できます。
別のコード ブロック内のコード ブロックを ネスティングする 場合は、ネスティングされているコード ブロックの最初に識別子を使用する必要があります。コードをネスティングするには、ブロック 式を使用します。
スペース入りの形式
この形式では、:
でブロックが開始され、各式はそれぞれに独自の行の後に続きます。各行は一様に 4 つのスペースで字下げされます。
if (test-arg-block):
expression1
expression2
if (test-arg-block)
はブロックの一部ではなく、ブロックは :
を含む行の最後に始まることに注意してください。
;
を使用して単一の行の複数の式を区切ることもできます。
複数行の中括弧で囲まれた形式
ブロックは {}
で囲まれ、式は新しい行に配置されます。
if (test-arg-block)
{
expression1
expression2
}
;
を使用して単一の行の複数の式を区切ることもできます。
単一行のドット形式
この形式ではブロックは .
. で始まり、各式は改行される代わりに、同じ行に配置され ;
で区切られます。
if (test-arg-block).expression1; expression2
else
を含む if
式で単一行のドット形式を使用する場合、else
の前に含めることができる式は、1 つだけです。次に例を示します。
if (test-arg-block).expression1 else.expression2