【发布时间】:2022-07-19 23:28:33
【问题描述】:
我无法理解从this code 提取的以下示例如何编译:
trait A: B {}
trait B {}
impl<T> B for T where T: A {}
struct Foo;
impl A for Foo {}
fn main() {}
我目前的理解是
-
trait A: B用超特征 B 声明特征 A。Rust reference on traits 状态
超特征是为实现特定特征而需要实现的特征。
-
impl<T> B for T where T:A为具有特征 A 的任何类型实现 B .
我预计impl A for Foo 会失败,因为在为 Foo 实现 A 之前,一揽子实现无法为 Foo 实现 B,这是必需的。
关于 rustc 在编译 sn-p 时所做的最合理的模型如下:
- 为 Foo 实现 A,将 Foo 实现 B 的检查推迟到稍后阶段
- 用一揽子实现为 Foo 实现 B,因为 Foo 现在实现了 A
- 检查 Foo 是否按照 trait bound
A: B的要求实现了 B
这在某种程度上接近事实吗?是否有任何我错过的文档来解释处理实现的顺序?
【问题讨论】:
-
只是猜测,不知道实际情况如何。但我的猜测是,您“首先实现它,然后实现它”的想法是错误的。我宁愿猜测 Rust 编译器构建了一个什么实现了什么的图表,在那个图表中,你编写的代码是一个循环。它是循环的事实并不能否定它是有效的。但同样,这只是一个猜测,我实际上并不知道。不管怎样,我很好奇这里的其他人对此有什么看法。也许@ChayimFriedman 知道更多?
-
Rust 编译器绝对不会逐行甚至逐文件考虑。编译单元是 crate,因此在解析“Does Foo 实现 B”时要考虑整个 crate 的源代码。我也知道它用泛型懒惰地评估特征实现,所以在某些代码尝试之前它甚至不会考虑“Foo 是否实现 B”。我确实想知道这是否在某处得到了适当的解释或编纂,但我在快速搜索参考或 rustc 指南时没有找到任何东西。这可以推断出来,因为没有特定于订单的文档。
-
“没有特定于订单的文档” - 我收回这一点,声明性宏是特定于订单的
标签: rust