Rust 程式設計視訊教程(進階)——026_1 高階 trait1

linghuyichong發表於2020-02-20

頭條地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

github地址:https://github.com/anonymousGiga/learn_rus...

1、關聯型別在trait定義中指定佔位符型別
關聯型別是一個將型別佔位符與trait相關論的方式。trait 的實現者會針對特定的實現在這個型別的位置指定相應的具體型別。如此可以定義一個使用多種型別的 trait。
(1)回憶使用關聯型別的例子中,Iterator trait:

pub trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
}

(2)為什麼不像如下,使用泛型?

pub trait Iterator<T> {
    fn next(&mut self) -> Option<T>;
}

如果使用泛型,實現的例子如下:

trait Iterator1<T> {
    fn next(&mut self) -> Option<T>;
}
struct A {
    value: i32,
}
impl Iterator1<i32> for A {
    fn next(&mut self) -> Option<i32> {
        println!("in next function: i32");
        if self.value > 3 {
            self.value += 1;
            Some(self.value)
        } else {
            None
        }
    }
}
impl Iterator1<String> for A {
    fn next(&mut self) -> Option<String> {
        println!("in next function: string");
        if self.value > 3 {
            let s = String::from("hello");
            Some(s)
        } else {
            None
        }
    }
}
fn main() {
    let mut a = A{value: 3};
    //a.next();   //錯誤,因為編譯器不知道呼叫哪個實現
    <A as Iterator1<String>>::next(&mut a);      //完全限定語法,帶上了具體的型別
    <A as Iterator1<i32>>::next(&mut a);         //完全限定語法,帶上了具體的型別
    println!("Hello, world!");
}

說明:使用泛型的方式,則如例子中在實現trait的時候必須帶上具體的型別,呼叫時也必須帶上具體的型別。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

令狐一衝

相關文章