Rust 标准库中类型的特征实现的范围是什么?

Joh*_*ohn 4 rust

锈书上说:

我们也可以在我们的板条箱中实现SummaryVec<T>因为aggregator该特征Summary是我们的aggregator板条箱本地的。

https://doc.rust-lang.org/book/ch10-02-traits.html#implementing-a-trait-on-a-type

如果我的包使用 crates.io 中的另一个包(例如 )rand,并rand在标准库中的类型(例如 )上实现特征Vec<T>,那么我的代码是否能够看到这些方法?

我知道有一个限制,即特征必须在您使用其方法的范围内。如果rand在 上实现了自定义特征Vec<T>,并且我尝试在我的板条箱中使用该特征中的方法之一,编译器是否会告诉我需要rand在使用这些方法之前导入该特征,或者它会告诉我这些方法不不存在吗?如果是前者,如果我从 导入特征rand,我可以在 上使用这些方法吗Vec<T>

小智 5

根据我的实验,如果一个板条箱在外部类型上实现了一个特征,则可以使用正常规则访问该特征(也就是说,为了调用该特征的方法,您必须将其带入范围,但除此之外,没有什么特别的必需的)。您不需要做任何其他事情。

例如,考虑一下 crate serde,它提供了序列化和反序列化数据的工具。它提供了特征SerializeDeserialize,允许数据结构定义它们如何序列化和反序列化为各种格式。此外,它还为许多内置类型和 std 类型提供了这些特征的实现(请参阅此处此处)。我在这里做了一个快速实验,我的代码可以使用这些特征,而无需我做任何额外的事情(事实上,正如您所见,因为我从不直接使用这些特征,所以我什至不必将它们纳入范围)。

因此,据我所知,您的问题的答案是肯定的,您的代码可以使用 for 实现的rand特征Vec<T>。您需要做的就是从 导入该特征rand