先推薦一個鏈接
理解 Rust 2018 edition 的兩個新關鍵字 —— impl 和 dyn
官方文檔中,impl是限定泛型的語法糖,所以
trait Trait {} fn foo<T: Trait>(arg: T) { } fn foo(arg: impl Trait) { }
這2種情況是相同的
但是當impl做為返回值的時候就有不同了
trait Fly { fn fly(&self) -> bool; } struct Duck; impl Fly for Duck { fn fly(&self) -> bool { return true; } } fn foo<T>() -> T where T: Fly { Duck }
fn main() {
}
這樣編譯會報錯
expected type parameter `T`, found struct `std::boxed::Box`
將返回T改為Box<T>也仍然會報錯
trait Fly { fn fly(&self) -> bool; } struct Duck; impl Fly for Duck { fn fly(&self) -> bool { return true; } } fn foo<T>() -> Box<T> where T: Fly { Box::new(Duck) } fn main() { }
這種情況用impl就不會報錯
trait Fly { fn fly(&self) -> bool; } struct Duck; impl Fly for Duck { fn fly(&self) -> bool { return true; } } fn foo() -> impl Fly { Duck } fn main() { }
關於dyn
dyn用於&dyn Fly和Box(dyn Fly)這樣的引用和智能指針的限定,表明Fly是一個trait而不是struct,不加dyn也不會報錯。
