impl和dyn用法


先推薦一個鏈接

理解 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也不會報錯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM