impl Trait

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 5 minutes.

impl Trait allows you to work with types which you cannot name. The meaning of impl Trait is a bit different in the different positions.

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

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

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

思考一下,debuggable 的型別為何?您可以嘗試使用 let debuggable: () = .. 查看錯誤訊息顯示的內容。