제네릭타입을 많이 쓰다보면 <>괄호가 많이 달린 반환 타입을 볼수 있다.
use std::iter;
use std::vec::IntoIter;
fn cyclical_zip(v:Vec<u8>, u: Vec<u8>) ->
iter: Cycle<iter::chain<IntoIter<u8>, IntoIter<u8>>> {
v.into_iter().chain(u.into_iter()).cycle()
}
이럴때 반환타입을 impl Trait으로 리펙토링하면 거기에서 구현하고 있는 트레이드만 지정할 수 있게 된다.
use std::fmt::Display;
fn print(val: impl Display) {
println!("{}", val);
}
fn main() {}
하지만 단점도 존재하는데 함수에서 반환되는 Circle, Triangle, Rectangle 타입이 제각각일수 있어서 오류가난다. 명심해야 할것은 특정 타입에 연관된 함수만 impl Trait를 반환 타입으로 쓸수 있다.
trait Shape {
fn new() -> Self;
fn area(&self) -> f64;
}
fn make_shape(shape:&str) -> impl Shape {
match shape {
"circle" => Circle::new(),
"triangle" => Triangle::new(),
"shape" => Rectangle::new(),
}
}
fn main() {}
https://www.yes24.com/Product/Goods/116789691
'Rust' 카테고리의 다른 글
자바스크립트 러스트 클로저 비교, 메모리관리 (0) | 2024.01.26 |
---|---|
Rust Closure (0) | 2024.01.24 |
러스트 제네릭 스트럭트 (0) | 2024.01.15 |
러스트 모듈(pub mod) (0) | 2024.01.09 |
러스트 제네릭(generic) 함수 정의 (0) | 2024.01.01 |