導入
処理に名前を付けて再利用できるようにするのが 関数 です。Rust の関数には「戻り値は最後の式」という独特のルールがあり、ここが式指向の入り口になります。
説明
fn main() {
let sum = add(3, 4);
println!("合計: {sum}");
greet("Rust");
}
// 引数に型注釈、戻り値は -> のあとに型を書く
fn add(a: i32, b: i32) -> i32 {
a + b // ← セミコロンなし。これが戻り値になる
}
// 戻り値がない関数は -> を省略できる
fn greet(name: &str) {
println!("こんにちは、{name}!");
}
fn add(a: i32, b: i32) -> i32… 引数には必ず型注釈が要ります。-> i32は戻り値の型。a + b… 関数の最後の式が戻り値になります。セミコロンを付けないのがポイント。- もし
a + b;とセミコロンを付けると、それは「値を返さない文」になり、戻り値が()(空)になってしまいエラーです。
ここで Rust の核心「文(statement)と式(expression)」の違いです。
- 文:何かを実行するが、値を返さない(例:
let x = 5;)。 - 式:評価されると値になる(例:
5 + 3、関数呼び出し、{ ... }ブロック)。
ブロック { ... } すら式です。最後の式がブロックの値になります。
fn main() {
let y = {
let a = 3;
a + 1 // セミコロンなし → このブロックは 4 という値になる
};
println!("y = {y}"); // y = 4
}
return を使って途中で返すこともできますが、Rust では「最後の式を返す」書き方が基本です。
試すには
add の a + b を a + b; に変えると、expected i32, found () というエラーが出ます。「セミコロンを付けると値が消える」——式指向の言語ならではの挙動です。