타입 추론

러스트는 변수가 어떻게 사용되는지를 보고 그 변수의 타입을 추론합니다:

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);
}
This slide should take about 3 minutes.

이 슬라이드는, 러스트 컴파일러가 변수가 어떻게 선언되어 있고, 어떻게 사용되는지를 제약 조건으로 삼아서 변수의 타입을 추론하는 모습을 보여줍니다.

여기서 중요한 것은, 이렇게 명시적인 타입을 생략하고 선언되었다고 해서 "어떤 타입"이라도 다 담을 수 있는 타입이 되는 것은 아니라는 점입니다. 명시적인 타입 선언이 있던 없던, 컴파일러가 생성한 머신코드는 동일합니다. 컴파일러는 단지 타입 선언을 생략할 수 있도록 해서 프로그래머가 더 간결한 코드를 쓸 수 있도록 도와줄 뿐입니다.

아무것도 정수 리터럴의 타입을 제한하지 않는 경우 Rust는 기본적으로 i32를 사용합니다. 그러면 오류 메시지에 {integer}로 표시될 수 있습니다. 마찬가지로 부동 소수점 리터럴의 기본값은 f64입니다.

fn main() {
    let x = 3.14;
    let y = 20;
    assert_eq!(x, y);
    // ERROR: `{float} == {integer}` 구현이 없음
}