impl Trait
与特征边界类似,impl Trait
语法可以在函数实参 和返回值中使用:
use std::fmt::Display; fn get_x(name: impl Display) -> impl Display { format!("Hello {name}") } fn main() { let x = get_x("foo"); println!("{x}"); }
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
语法执行相同的操作,则需要两个 独立的泛型形参。