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) 이라는 식으로 사용하면 된다. Into From 트레잇은 변환될 타입의 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)

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

RAII는 무엇인가

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

[Python] cache 데코레이터로 최적화하기

[Web] SpeechSynthesis - TTS API