为什么嵌套的关联类型路径被认为是不明确的?

fn flatten<I>(iter: I) -> Option<I::Item::Item>
where
    I: Iterator,
    I::Item: IntoIterator,
{
    None
}
error[E0223]: ambiguous associated type
 --> src/lib.rs:1:34
  |
1 | fn flatten<I>(iter: I) -> Option<I::Item::Item>
  |                                  ^^^^^^^^^^^^^ help: use fully-qualified syntax: `<<I as Iterator>::Item as Trait>::Item`

如果没有完全限定的语法,编译器不应该解析路径吗?我只能提到一种类型,所以我不明白为什么它是模棱两可的.在这种简单的情况下,这并不是一个真正的问题,但在更复杂的用例中,它会变得痛苦:

fn blah() -> <<<<A as B>::C as D>::E as F>::G as H>::I as J>::K> {}

这是编译器的限制还是预期的行为?

推荐答案

这是一个编译器限制:Nested associated type projection is overly conservative #38078.有一点希望chalk能改善情况,但不能保证它能.

Rust相关问答推荐

为什么类型需要在这个代码中手动指定,在rust?

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

在Rust中显式装箱受生存期限制的转换闭包

用 rust 蚀中的future 展望 struct 的future

自定义结果枚举如何支持`?`/`FromResidual`?

如何实现Serde::Ser::Error的调试

如何执行数组文字的编译时串联?

Boxing 如何将数据从堆栈移动到堆?

可以在旋转循环中调用try_recv()吗?

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

如何基于常量在Rust中跳过一个测试

Rust 程序中的内存泄漏

Rust 中的自动取消引用是如何工作的?

为什么不能在 Rust 中声明静态或常量 std::path::Path 对象?

在 Rust 中实现资源消耗的安全包装器

如何连接 Rust 中的相邻切片

仅在运行测试时生成调试输出

在空表达式语句中移动的值

如何为返回正确类型的枚举实现 get 方法?

返回 &str 但不是 String 时,borrow 时间比预期长