型推論

Rust は、変数がどのように 使われるか を見て型を決定します。

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn takes_u32(x: u32) {
    println!("u32: {x}");
}

fn takes_i8(y: i8) {
    println!("i8: {y}");
}

fn main() {
    let x = 10;
    let y = 20;

    takes_u32(x);
    takes_i8(y);
    // takes_u32(y);
}

このスライドでは、変数宣言とその使用によって与えられる制約に基づいて、Rust コンパイラがどのように型を推論するかを示します。

このように宣言された変数が、あらゆるデータを保持できる何らかの動的な「任意の型」であるわけではないことを、強調するのは非常に重要です。こうした宣言によって生成される機械語コードは、型を明示した宣言によって生成されるものと同一です。コンパイラがその作業を代わりに行ってくれるため、より簡潔なコードを書くことができます。

整数リテラルの型を制約するものが何もない場合、Rust はデフォルトで i32 を使用します。これは、エラーメッセージでは {integer} と表示されることがあります。同様に、浮動小数点リテラルのデフォルトは f64 です。

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let x = 3.14;
    let y = 20;
    assert_eq!(x, y);
    // エラー: `{float} == {integer}` に対する実装がありません
}