Rust 関数

Rust 言語では、関数はいたるところに存在しています。

これまでの章で、Rust 関数の基本形式を学ぶことができました:

fn <函数名> ( <参数> ) <函数体>

Rust の関数名の命名スタイルは、小文字をアンダースコアで区切るというものです:

例

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

fn another_function() {
    println!("Hello, サンプル!");
}

実行結果:

Hello, world!
Hello, サンプル!

注意:ソースコードでは、main 関数の後に another_function を定義しました。 Rust は関数をどこで定義するかを気にしません。どこかで定義されていれば十分です。

関数パラメータ

Rust で関数を定義する際にパラメータが必要な場合、パラメータ名と型を宣言する必要があります:

例

fn main() {
    another_function(5, 6);
}

fn another_function(x: i32, y: i32) {
    println!(x の値は : {}, x);
    println!(y の値は : {}, y);
}

実行結果:

x 的值为 : 5
y 的值为 : 6

関数本体の文と式

Rust の関数本体は、式(Expression)で終わることができる一連の文(Statement)で構成されています。これまでに、式で終わらない関数しか見ていませんが、式を文の一部として使用したことはあります。

文は、何らかの操作を実行し、戻り値を持たないステップです。例:

let a = 6;

このステップには戻り値がないため、次の文は正しくありません:

let a = (let b = 2);

式には計算ステップがあり、戻り値があります。以下は式の例です(出現する識別子はすでに定義されていると仮定します):

a = 7
b + 2
c * (a + b)

Rust では、`{ }` を使って{}囲まれたブロック内に、より複雑な式を記述できます:

例

fn main() {
    let x = 5;

    let y = {
        let x = 3;
        x + 1
    };

    println!(x の値は : {}, x);
    println!(y の値は : {}, y);
}

実行結果:

x 的值为 : 5
y 的值为 : 4

明らかに、このプログラムには式ブロックが含まれています:

{
    let x = 3;
    x + 1
};

さらに、ブロック内では関数文を使用できます。最後のステップは式であり、この式の結果値が式ブロック全体を表す値になります。このような式ブロックは関数本体の式と呼ばれます。

注意:x + 1その後にはセミコロンを付けないでください。さもないと、文になってしまいます!

この式ブロックは、正当な関数本体です。さらに、Rust では関数定義をネストできます:

例

fn main() {
    fn five() -> i32 {
        5
    }
    println!(five() の値は: {}, five());
}

関数の戻り値

前のネストした例では、Rust 関数が戻り値の型を宣言する方法がすでに示されています:パラメータ宣言の後に->関数の戻り値の型を宣言します(ではなく: )。

関数本体では、いつでも `return` キーワードを使用して関数の実行を終了し、適切な型の値を返すことができます。これは、ほとんどの開発者の経験に最も近い方法でもあります:

例

fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

しかし、Rust は戻り値の型の自動判定をサポートしていません!戻り値の型を明示的に宣言しない場合、その関数は「純粋プロシージャ」と見なされ、戻り値を生成することはできません。`return` の後には戻り値の式を置くことができません。この目的は、公開された関数が目に見える契約を形成できるようにするためです。

注意:関数本体の式は関数本体と同等ではなく、`return` キーワードを使用できません。returnキーワード。

その他の拡張