English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Rust ファンクション

関数はRust言語で普遍的に存在します。

前の章で既にRust関数の基本的な形式を学ぶことができます:

fn <関数名> ( <パラメータ> ) <関数体>

Rustの関数名の命名スタイルは、小文字のアルファベットでアンダースコアで区切られたものです:

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

実行結果:

Hello, world!
Hello, w3codebox!

注意、ソースコードの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 キーワード。