関数はアクションを実行できます。 関数を呼び出して実行できる処理の 1 つに値を返すことがあります。 この値が結果です。
たとえば、GetRandomInt(1, 10) を呼び出すと、1 ~ 10 の間のランダムな整数を取得できることが想定されます。
関数から取得する値の型を変更するには、関数シグネチャの型を変更します。 次に例を示します。
GetNumberOfMousetrapsYouCanAfford() : int
この例では、GetNumberOfMousetrapsYouCanAfford() の戻り値の型が int であるため、コード内で GetNumberOfMousetrapsYouCanAfford() を呼び出す場合は整数が返されることが想定できます。
GetNumberOfMousetrapsYouCanAfford() : float
一方で、型を float に変更すると異なるタイプの値が返されます。
関数の戻り値の型が指定されている場合、関数の本体 (コード ブロック) はその型に一致する結果を生成しなければなりません。 生成しない場合はコードがコンパイルされず、つまりコンパイル エラーが発生することになります。 以降では、これを回避する方法について学びます。
結果と戻り値
結果とは、関数が実行された (動作した) ときにその関数が返す値のことです。
レッスン 2 ではキーワードについて説明しましたが、これは Verse に組み込まれている特殊な単語であり、非常に特殊なアクションが関連付けられています。
Verse では、return も、return キーワードの後に続く式から生成される値を与えるように関数に指示するキーワードです。
MyFunction() : int =
return 5
OnBegin<override>()<suspend> : void =
MyFunction() # result is 5
上記のコード例では、MyFunction() が呼び出されたときに 5 という値が返されます。
return をそのままにしておいても関数に問題は発生しませんが、return を明示的に含めることをお勧めします。 この詳細については、「関数」を参照してください。
早期の return
プログラムで return 式が実行されると、関数のコード ブロックはすぐに終了します。 つまり、他のコードの前に return 式を配置すると後続のコードは実行されません。 これは、特定の条件が満たされた時点で関数を早期に終了する場合に便利です。
次の関数は、CoinsPerMouseTrap に基づいて Coins 変数を更新します。 ただし、ネズミ捕り器を購入するには Coins 変数が正の値に設定されている必要があります。 Coins が負の場合、関数はエラー メッセージを出力してすぐに戻り値を返します。関数本体内の残りのコードを実行する理由がないためです。
実際のところ、return を使用しないと、この関数では Coins の値が誤って減らされて、Coins が負の値であったことが示されません。
var Coins : int = -10
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
Print(“Mousetrap bought! You have {Coins} coins left.”)
return を使用して関数を早期に終了するとバグが発生する可能性があるため、注意して使用することが重要です。 たとえば、return は、次のコードにある Print(“Mousetrap bought! You have {Coins} coins left.”) よりも前に実行されるため、この関数によって Coins の新しい値が出力されることはありません。
var Coins : int = 500
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
return
Print("Mousetrap bought! You have {Coins} coins left.")
コード内に早期の return があってもコンパイルされますが、Visual Studio Code では、return の後に続く式が実行されないことを示す警告が表示されます。
有益な結果のない関数の Void
結果が必要な場合もあれば、必要ない場合もあります。
レッスン 2 で学習した型について覚えていれば、それぞれの型に特定の種類の値が必要なことも覚えているでしょう。 以下は、その非常に簡単なリストです。 Verse では多数の型が使用されますが、これらは最もよく使われる型であり、変数や定数を使用する上での基礎です。
| 型 | 動作 | 値 |
|---|---|---|
| この型の結果は True または False のいずれかになります。 | True / False |
| 整数 (integer) は小数ではなく整数 (whole number) であり、 | 整数値 |
| この型は、小数などの整数ではない値のためのものです。 | 小数点を含む数値 |
| この型はあらゆるテキスト (文字列) のためのものです。 これには文字列や数字、句読点、スペース、さらに絵文字を含めることができます。 😻 | 文字列、数字、句読点、スペース、絵文字 |
結果を生成する必要のない関数を作成する場合は、この関数の戻り値の型を void に設定することができます。
つまり、関数の型が void に設定されるため、コード ブロックの最後の式で、コンパイラ エラーを生じさせることなくあらゆる型の結果を生成できます。
void 型の関数に対して return キーワードを使用することは可能ですが、return キーワードを使用する際に値を提供する必要はありません。
まとめ
結果とは、関数を呼び出したときに返されるものです。
コード ブロック内では、最後の式によって結果が生成されます。
関数が返す値の型を変更するには、関数シグネチャで型を変更します。
return は、その後に続く式から生成される値を返すように関数に指示するキーワードです。
早期の return は、コード ブロックが終わる前に return キーワードが使用されている場合に発生します。 これにより、プログラムによってコード ブロックがすぐに終了し、そのコード ブロック内の残りのコードは実行されません。
void は、関数の値が他のどこでも使用されないことを表す型です。 あるいは、単に処理を実行する価値がないことを示します。 void は、結果を生成する必要がない関数の型として使用できます。