Appearance
21.3 impl 块中的泛型
impl 的时候也可以使用泛型。在impl <Trait> for <Type> { }
这个语法结构中,泛型类型既可以出现在<Trait>
位置,也可以出现在<Type>
位置。
与其他地方的泛型一样,impl 块中的泛型也是先声明再使用。在 impl 块中出现的泛型参数,需要在impl
关键字后面用尖括号声明。
当我们希望为某一组类型统一 impl 某个 trait 的时候,泛型就非常有用了。有了这个功能,很多时候就没必要单独为每个类型去重复 impl 了。以标准库中的代码为例:
rust
impl<T, U> Into<U> for T
where U: From<T>
{
fn into(self) -> U {
U::from(self)
}
}
上面这段代码中,impl 关键字后面的尖括号<T, U>
意思是先声明两个泛型参数,后面会使用它们。这跟类型、函数中的泛型参数规则一样,先声明、后使用。
标准库中的 Into 和 From 是一对功能互逆的 trait。如果A: Into<B>
,意味着B: From<A>
。因此,标准库中写了这样一段代码,意思是针对所有类型 T,只要满足U: From<T>
,那么就针对此类型impl Into<U>
。有了这样一个 impl 块之后,我们如果想为自己的两个类型提供互相转换的功能,那么只需 impl From 这一个 trait 就可以了,因为反过来的 Into trait 标准库已经帮忙实现好了。