타입 추론
러스트는 변수가 어떻게 사용되는지를 보고 그 변수의 타입을 추론합니다:
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}` 구현이 없음 }