Rust で関数を操作する

完了

関数は、Rust 内でコードを実行する主要な方法です。 この言語で、最も重要な関数の 1 つは既に見た main 関数です。 このユニットでは、関数を定義する方法を詳細に説明します。

関数を定義する

Rust での関数定義は、fn キーワードで始まります。 関数名の後に、関数の入力引数を、かっこ内のデータ型のコンマ区切りリストとして指定します。 中かっこは、関数本体の開始と終了の位置をコンパイラに伝えます。

fn main() {
    println!("Hello, world!");
    goodbye();
}

fn goodbye() {
    println!("Goodbye.");
}

関数を呼び出すには、その名前をかっこ内の入力引数と共に使用します。 関数に入力引数が存在しない場合は、かっこを空のままにします。 この例では、maingoodbye の両方の関数に入力引数がありません。

main 関数の後に goodbye 関数が定義されていることにお気付きかと思います。 goodbye 関数は、main を定義する前に定義しました。 Rust では、関数がファイル内のどこかに定義されている限り、ファイル内のどこに定義されているかは留意されません。

入力引数を渡す

関数に入力引数がある場合は、各引数に名前を付け、関数宣言の最初にデータ型を指定します。 引数には変数のように名前が付けられているので、関数本体内で引数にアクセスできます。

goodbye 関数を変更し、入力引数として文字列データへのポインターを受け取るようにしてみましょう。

fn goodbye(message: &str) {
    println!("\n{}", message);
}

fn main() {
    let formal = "Formal: Goodbye.";
    let casual = "Casual: See you later!";
    goodbye(formal);
    goodbye(casual);
}

2 つの異なる引数値を使用して main 関数からこの関数を呼び出すことでテストし、出力を調べます。

Formal: Goodbye.
Casual: See you later!

値を返す

関数が値を返す場合は、関数の引数のリストの後、関数本体の左中かっこの前に構文 -> <type> を追加します。 矢印の構文 -> は、関数から呼び出し元に値が返されることを示します。 コンパイラは、<type> の部分により、返された値のデータ型を知ることができます。

Rust での一般的な方法では、関数の最後のコード行を返す値と同じにすることで、関数の終了時に値を返します。 この動作の例を次に示します。 divide_by_5 関数からは、入力値を 5 で割った結果が呼び出し元の関数に返されます。

fn divide_by_5(num: u32) -> u32 {
    num / 5
}

fn main() {
    let num = 25;
    println!("{} divided by 5 = {}", num, divide_by_5(num));
}

出力は次のようになります。

25 divided by 5 = 5

関数内の任意の場所で return キーワードを使って、実行を停止し、呼び出し元に値を返すことができます。 通常、return キーワードは、条件テストと組み合わせて使います。

次に、num の値が 0 の場合は return キーワードを明示的に使用して関数から早期に戻る例を示します。

fn divide_by_5(num: u32) -> u32 {
    if num == 0 {
        // Return early
        return 0;
    }
    num / 5
}

return キーワードを明示的に使用する場合は、セミコロンでステートメントを終了します。 return キーワードを使用せずに戻り値を返す場合は、ステートメントをセミコロンで終了しないでください。 戻り値 num / 5 のステートメントで、最後にセミコロンを使用しなかったことに気付かれたかもしれません。

シグネチャを確認する

関数の宣言の最初の部分は、"関数シグネチャ" と呼ばれます。

この例の goodbye 関数のシグネチャには、これらの特性があります。

  • fn: Rust の関数宣言キーワード。
  • goodbye: 関数名。
  • (message: &str): 関数の引数または "パラメーター" リスト。 入力値としては、文字列データへの 1 つのポインターが必要です。
  • -> bool: 矢印は、この関数が常に返す値の型を指しています。

goodbye 関数は、入力として 1 つの文字列ポインターを受け取り、ブール値を出力します。

この Rust Playground 内で、コード例を操作できます。