5월, 2019의 게시물 표시

[Rust] 타입 변환하기

Rust에서 타입 변환은 특별한 것이 아니다. 그저 단순히 하나의 값을 소유권을 받아 다른 타입의 값을 반환하는 함수다. 따라서 자신이 원하는 이름으로 아무 함수나 만들면 된다. 하지만 가독성을 위해 as_, to_, into_를 prefix로 사용하는 method를 만들거나, from_가 prefix로 붙는 생성자를 만들어 converting constructor처럼 만들어 사용한다.From타입 변환을 보다 일반적으로 구현하고 싶으면 From 트레잇을 구현하면 된다. 예를 들어 A라는 타입을 B라는 타입으로 변환하고 싶을 때는, B 타입에 From<A>를 구현하는 것이다. From 트레잇은 from이라는 associated function을 제공하기 때문에 A타입의 변수 a를 B타입으로 변환시킬 경우 From::from(a)이라는 식으로 사용한다. 만약, 컴파일러가 타입 추론을 못 해주는 경우 변환할 타입을 명시적으로 적어 B::from(a)이라는 식으로 사용하면 된다.IntoFrom 트레잇은 변환될 타입의 associated function을 제공한다. 덕분에 변환될 타입을 명시할 수 있다. 이는 From 트레잇의 장점이지만, 구체적인 타입을 많이 적을수록 코드의 범용성을 떨어뜨린다. 범용성을 떨어뜨리지 않기 위해 From::from(a)와 같은 식으로 사용할 수도 있지만, from은 associated function이기 때문에 a.from() 같은 식으로 호출할 수는 없다. 이 경우 Into 트레잇이 유용하게 사용된다.From 트레잇이 변환될 타입의 associated function을 제공하는 반면, Into는 into라는 method를 제공한다. 따라서 A 타입에서 B로 가는 Into 트레잇을 구현하고 있으면, A 타입인 변수 a가 있을 때, a.into() 같은 식으로 변환 함수를 호출할 수 있다. 물론, A::into(a)나 Into::into(a) 같은 식으로 호출하는 것이 문법적으로 틀린 것은 아니지만, 굳이 이렇게 의미 없이 긴…