頭條地址: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 協議》,轉載必須註明作者和本文連結