在查看 Rust 结构体的文档时,我经常会遇到标题为“Blanket Implements”的部分。我听说它可以用来实现所有类型或匹配某些条件的所有类型的特征,但我不确定为什么需要这样做。
那么一揽子实现到底是什么?为什么它们在 Rust 中有用?
kmd*_*eko 19
一揽子实现是对通用参数的特征的实现:
impl<T> Trait for T
Run Code Online (Sandbox Code Playgroud)
它们通常还where涉及子句,因为很难对不受约束的T. 这不包括诸如 之类的内容impl<T> Trait for Vec<T>,这是一个通用实现,但不是一揽子实现。
它们是单独记录的,因为它们的应用没有任何特殊性,并且可能与您正在查看的类型相关,也可能不相关。而对于正常的“特征实现”部分,所有这些特征至少都考虑到了特定类型(通常)。
它们显然很有用,因为它在整个生态系统中实现了任何事物的特征!如果某些东西满足约束,那么它就能够利用实现而无需自己实现它。除了将特征纳入范围之外,您不需要做任何事情来“选择加入”。
一些值得注意的:
From<T>为所有人实施T(身份实施)Into<U>T为所有位置实现(自反实现,允许您在存在匹配实现时T: From<U>调用).into()FromAny已在所有T地方实施T: 'static它们还需要实现“特征别名”,您可以在其中创建一个受多个其他特征约束的特征(方便减少样板文件并且是多特征特征对象所需的)。您使用一揽子实现,该特征是为满足超级特征的任何类型实现的:
trait MyCoolAsyncTrait: AsyncRead + AsyncWrite + AsyncSeek + 'static {}
impl<T> MyCoolAsyncTrait for T
where
T: AsyncRead + AsyncWrite + AsyncSeek + 'static
{ }
Run Code Online (Sandbox Code Playgroud)
不过,将它们添加到您的类型时要小心。由于其范围广泛,它们很容易与其他可能需要的特征实现发生冲突。您只能为每种类型定义一个一揽子实现(即使约束不重叠)。
也可以看看:
| 归档时间: |
|
| 查看次数: |
4824 次 |
| 最近记录: |