コンテンツにスキップ

関数

fn 名前(引数: 型, ...) -> 戻り値型 { ... } で定義します。引数には型が必要です。関数はトップレベルにだけ定義できます。

fn larger(a: i64, b: i64) -> i64 {
a > b ? a : b
}
print larger(12, 8);

本体の末尾式が戻り値になります。呼び出し時に引数の個数と型を検査します。引数は左から右へ評価します。

トップレベルの実行文はそのまま実行されるため、特別な main 関数は不要です。関数は定義より前から呼べます。再帰呼び出しも使えます。

print factorial(6);
fn factorial(n: i64) -> i64 {
n <= 1 ? 1 : n * factorial(n - 1)
}

return 値; で途中から戻れます。戻り値の型を省略した関数の戻り値型は () です。その関数から早く戻る場合は return; と書きます。

fn absolute(x: i64) -> i64 {
if x < 0 {
return -x;
}
x
}
fn show_positive(x: i64) {
if x <= 0 {
return;
}
print x;
}
print absolute(-12);
show_positive(7);

ブロック式の内部にある return も、それを囲む関数全体から戻ります。トップレベルの実行文には return を書けません。

引数はスカラー値のコピーです。関数内で引数を変更しても、呼び出し元の変数は変わりません。

fn increment(value: i32) -> i32 {
value += 1;
value
}
original = 4;
print increment(original), original; // 5 4

関数は、トップレベルの実行文で定義した変数を取り込みません。必要な値は引数で渡します。

関数名と変数名は別々に解決するため、同じ名前を使えます。

fn value() -> i32 { 7 }
value = 3;
print value, value(); // 3 7

value() は名前付きの関数呼び出し、value は変数の読み出しです。変数に関数を代入して間接的に呼び出す機能ではありません。同名の関数を複数定義することや、同じ引数名を重複させることはエラーです。

戻り値の検査では、while が終了する可能性を考慮します。次の例は戻り値がない可能性があるためエラーになります。

fn example() -> i32 {
while true { return 1; }
}

ループ後にも型の合う末尾式か return を置く必要があります。詳細は制御フローを参照してください。

実装の参照先: 関数の構文、引数・戻り値・名前の検査。