New Type 관용구
newtype 관용구는 프로그램에 올바른 타입의 값이 제공됨을 컴파일 타임에 보장해 줍니다.
예를 들어, 나이를 연 단위로 확인하는 나이 검증 함수는 반드시 Years 타입의 값을 받아야 합니다.
struct Years(i64);
struct Days(i64);
impl Years {
pub fn to_days(&self) -> Days {
Days(self.0 * 365)
}
}
impl Days {
/// 부분적인 연도는 버립니다
pub fn to_years(&self) -> Years {
Years(self.0 / 365)
}
}
fn is_adult(age: &Years) -> bool {
age.0 >= 18
}
fn main() {
let age = Years(25);
let age_days = age.to_days();
println!("성인입니까? {}", is_adult(&age));
println!("성인입니까? {}", is_adult(&age_days.to_years()));
// println!("성인입니까? {}", is_adult(&age_days));
}
마지막 출력문의 주석을 해제하여 제공되는 타입이 반드시 Years여야 함을 관찰해 보세요.
newtype의 값을 기본 타입으로 얻으려면, 다음과 같이 튜플 또는 구조 분해 문법을 사용할 수 있습니다:
struct Years(i64);
fn main() {
let years = Years(42);
let years_as_primitive_1: i64 = years.0; // 튜플
let Years(years_as_primitive_2) = years; // 구조 분해
}