関数
定義と呼び出し
Section titled “定義と呼び出し”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 と戻り値のない関数
Section titled “return と戻り値のない関数”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 を書けません。
引数と外側の変数
Section titled “引数と外側の変数”引数はスカラー値のコピーです。関数内で引数を変更しても、呼び出し元の変数は変わりません。
fn increment(value: i32) -> i32 { value += 1; value}
original = 4;print increment(original), original; // 5 4関数は、トップレベルの実行文で定義した変数を取り込みません。必要な値は引数で渡します。
関数名と変数名
Section titled “関数名と変数名”関数名と変数名は別々に解決するため、同じ名前を使えます。
fn value() -> i32 { 7 }
value = 3;print value, value(); // 3 7value() は名前付きの関数呼び出し、value は変数の読み出しです。変数に関数を代入して間接的に呼び出す機能ではありません。同名の関数を複数定義することや、同じ引数名を重複させることはエラーです。
戻り値の検査
Section titled “戻り値の検査”戻り値の検査では、while が終了する可能性を考慮します。次の例は戻り値がない可能性があるためエラーになります。
fn example() -> i32 { while true { return 1; }}ループ後にも型の合う末尾式か return を置く必要があります。詳細は制御フローを参照してください。
実装の参照先: 関数の構文、引数・戻り値・名前の検査。