impl Trait

與特徵界限類似,impl Trait 語法可用於 函式引數和回傳值中:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • impl Trait 可讓您使用無法命名的型別。

Speaker Notes

impl Trait 的涵義會因使用位置而有些微不同。

  • 對參數來說,impl Trait 就像是具有特徵界限的匿名泛型參數。

  • 對回傳型別來說,impl Trait 代表回傳型別就是實作特徵的 某些具體型別,因而不必指名特定型別。如果您不想在公用 API 中公開具體型別, 這就非常有用。

    在回傳位置進行推論並不容易。回傳 impl Foo 的函式 會挑選自身回傳的具體型別,而不必在來源中寫出此資訊。回傳泛型型別 (例如 collect<B>() -> B) 的函式則可回傳 符合 B 的任何型別 ,而呼叫端可能需要選擇一個型別,例如使用 let x: Vec<_> = foo.collect() 或 Turbofish:foo.collect::<Vec<_>>()

這個例子非常好,因為 impl Display 使用了兩次。這有助於說明此處沒有 任何項目會強制使用「相同的」impl Display 型別。如果我們使用單一的 T: Display,則會強制限制「輸入」T 和「回傳」T 屬於同一型別。 但這並不適合這個特定函式,因為我們預期做為「輸入」的型別不一定 會是 format! 回傳的內容。如要透過 : Display 語法執行相同操作,我們會 需要兩個獨立的泛型參數。