gpt4 book ai didi

rust - Rust 如何用循环特征边界编译这个例子?

转载 作者:行者123 更新时间:2023-12-05 05:37:52 26 4
gpt4 key购买 nike

我无法理解以下示例是如何从 this code 中提炼出来的, 编译:

trait A: B {}
trait B {}
impl<T> B for T where T: A {}

struct Foo;
impl A for Foo {}

fn main() {}

我目前的理解是

Supertraits are traits that are required to be implemented for a type to implement a specific trait.

  • impl<T> B for T where T:A为具有特征 A 的任何类型实现 B.

我希望 impl A for Foo失败是因为在为 Foo 实现 A 之前,一揽子实现无法为 Foo 实现 B,这是必需的。

对于 rustc 在编译代码片段时所做的事情,我最合理的模型如下:

  • 为 Foo 实现 A,将 Foo 实现 B 的检查推迟到稍后阶段
  • 通过一揽子实现为 Foo 实现 B,因为 Foo 现在实现了 A
  • 检查 Foo 是否按照特征界限 A: B 的要求实现了 B

这在某种程度上接近事实吗?是否有任何我遗漏的文档来解释实现的处理顺序?

最佳答案

rustc 不能“按顺序”工作。相反,我们首先注册所有 impl,然后不按特定顺序对每个 impl 进行类型检查。我们的想法是收集一份义务列表(各种类型 - 其中之一是特征限制),然后我们将它们与 impl 进行匹配。 s(不只是;这只是解决义务的一种方式,但这与此处相关)。每项义务都可以创建另一个递归义务,我们会对其进行详细说明,直到不再存在为止。

它目前的工作方式是当我们检查 impl Trait for Type ,我们添加义务Type: Trait .这可能看起来很愚蠢,但我们稍后会进一步详细说明,直到满足所有要求的界限。

假设我们目前正在检查 impl<T> B for T where T: A .我们添加一项义务,T: B , 并将其与 impl B for T 匹配.没有什么可以进一步阐述的,所以我们成功完成了。

然后我们检查 impl A for Foo , 并添加义务 Foo: A .自特征 A需要 Self: B ,我们添加另一项义务Foo: B .然后我们开始匹配义务:第一个义务,Foo: A , 与当前处理的 impl 匹配没有额外的义务。第二项义务,Foo: B , 与 impl<T> B for T where T: A 匹配.这有一个新的义务 - T: AFoo: A - 所以我们尝试匹配它。我们成功地将其与 impl A for Foo 匹配,没有额外的义务。

上面的一个有趣的含义是,如果我们改变第二个 impl到以下内容:

impl A for Foo where Foo: B {}

然后这不再编译为“溢出评估需求Foo: A”错误(playground),即使它本质上是相同的,因为现在要证明Foo: A rustc 需要证明 Foo: B再一次Foo: A ,虽然之前它只是注册了 Foo: B 的义务并没有立即证明。

注意:以上是过于简单化了:例如,还有缓存、格式良好的义务等等。但总的原则是一样的。

关于rust - Rust 如何用循环特征边界编译这个例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73037332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com