본문 바로가기

Rust

러스트 impl 트레이트 반환타입

제네릭타입을 많이 쓰다보면  <>괄호가 많이 달린 반환 타입을 볼수 있다.

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

프로그래밍 러스트 - 예스24

『러스트 프로그래밍 공식 가이드』보다 더 친절하게, 한층 더 고급 기능까지 다룬다!이 책은 메모리 안전성과 신뢰할 만한 동시성에 예측 가능한 성능을 더한 러스트의 기능이 어떤 식으로 메

www.yes24.com

 

'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