【问题标题】:What is the scope of a trait implementation on a type from the standard library in Rust?Rust 标准库中类型的 trait 实现的范围是什么?
【发布时间】:2021-06-29 15:45:56
【问题描述】:

锈书说:

我们也可以在 Vec<T> 上实现 Summary aggregator crate, 因为特征 Summary 是我们的 aggregator crate 的本地特征。

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

如果我的包使用来自 crates.io 的另一个 crate,例如 rand,并且 rand 在标准库中的一个类型上实现了一个 trait,例如 Vec<T>,我的代码是否能够看到这些方法?

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

【问题讨论】:

    标签: rust


    【解决方案1】:

    根据我的实验,如果一个 crate 实现了一个外来类型的 trait,则可以使用常规规则访问该 trait(也就是说,为了调用该 trait 的方法,您必须将其引入范围,否则,没有什么特别的要求)。你不需要做任何其他事情。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      • 2021-08-29
      • 2015-02-24
      • 2021-03-26
      相关资源
      最近更新 更多