Rust 연관 유형 및 기본 일반 유형 매개변수

2831 단어
1. 연관 유형(associated types)
Rust 프로그램을 읽을 때 다음과 같은 코드가 나타날 때가 있습니다.
trait Iterator {
    type Item; 
    fn next(&mut self) -> Option<:item>;
}

다음은 위 코드에 대한 설명입니다. Iterator trait에는 연관 유형Item이 있습니다.Item는 점유 유형이며,next 방법은 Option<:item/> 유형의 값을 되돌려줍니다.이trait의 실현자는 Item의 구체적인 유형을 지정할 것이다.
여기type의 용법이 바로 관련 유형이다.
연관 유형(associated types)은 유형 자리 표시자를trait와 연관시키는 방식으로trait 방법 서명에서 이 자리 표시자 유형을 사용할 수 있습니다.trait의 실현자는 특정한 실현에 대해 이 유형의 위치에 해당하는 구체적인 유형을 지정한다.이렇게 하면 여러 종류의trait를 사용할 수 있으며, 이trait가 실현될 때까지 이러한 유형이 구체적으로 무엇인지 알 필요가 없다.
연관 유형을 사용하는 코드의 예는 다음과 같습니다.
pub trait Watch {
    type Item;
    fn inner(&self) -> Option<:item>;
}

struct A {
    data: i32,
}

impl Watch for A {
    type Item = i32;
    fn inner(&self) -> Option<:item> {
        Some(self.data)
    }
}

struct B {
    data: String,
}

impl Watch for B {
    type Item = String;
    fn inner(&self) -> Option<:item> {
        Some(self.data.clone())
    }
}

fn main() {
    let a = A{data: 10};
    let b = B{data: String::from("B")};
    assert_eq!(Some(10), a.inner());
    assert_eq!(Some(String::from("B")), b.inner());
}

2. 기본 일반 유형 매개 변수
다음과 같은 유형의 코드도 만나게 됩니다.
#[lang = "add"]
pub trait Add {
    type Output;
    
    #[must_use]
    fn add(self, rhs: RHS) -> Self::Output;
}

여기Add는 기본 범주 형식 매개 변수로 지정한 범주 형식을 표시하지 않으면 기본 범주 형식Self을 나타낸다.
일반 형식 파라미터를 사용할 때, 일반 형식에 기본적인 구체적인 형식을 지정할 수 있습니다.기본 형식이 충분하다면, 구체적인 형식을 위한trait의 필요성을 없앨 수 있습니다.일반 형식에 기본 형식을 지정하는 문법은 일반 형식을 설명할 때 사용됩니다.
기본 일반 유형 매개 변수를 사용하는 예제 코드는 다음과 같습니다.
pub trait Watch {
    type Item;
    fn inner(&self) -> Option<:item>;
    fn info(&self) -> Inner;
}

struct A {
    data: i32,
}

impl Watch for A {
    type Item = i32;
    fn inner(&self) -> Option<:item> {
        Some(self.data)
    }
    fn info(&self) -> i32 {
        println!("A inner is {}", self.data);
        self.data
    }
}

struct B {
    data: String,
}

impl Watch for B {
    type Item = String;
    fn inner(&self) -> Option<:item> {
        Some(self.data.clone())
    }
    fn info(&self) -> String {
        println!("B inner is {}", self.data);
        self.data.clone()
    }
}

fn main() {
    let a = A{data: 10};
    let b = B{data: String::from("B")};
    assert_eq!(10, a.info());
    assert_eq!(Some(String::from("B")), b.inner());
}

좋은 웹페이지 즐겨찾기