消除结构中关联类型的歧义

Abh*_*nda 4 rust

我正在尝试运行这个

use std::collections::BTreeSet;

pub struct IntoIter<T> {
    iter: BTreeSet<T>::IntoIter,
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

操场

这失败了

use std::collections::BTreeSet;

pub struct IntoIter<T> {
    iter: BTreeSet<T>::IntoIter,
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

为什么关联类型不明确?

She*_*ter 5

“模棱两可”在这里似乎有点误导性的措辞。此示例产生相同的错误消息:

struct Foo;

pub struct Bar {
    iter: Foo::Baz,
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

我不确定,但我发现Baz在标准库中不太可能有一个关联类型,更不可能有两个让它变得模棱两可!

更有可能的是,这种语法不够具体。这是完全合理的,有可能是,可能有多种性状Baz相关的类型。因此,您必须指定要使用以下关联类型的特征:

struct Foo;

pub struct Bar {
    iter: <Vec<u8> as IntoIterator>::IntoIter,
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

  • 另一种表达方式:Rust 反对添加 `use` 语句破坏代码的概念。如果你有一个 `trait Trait { type IntoIter; }` 为`BTreeSet&lt;T&gt;` 实现,然后如果它允许`BTreeSet&lt;T&gt;::IntoIter`,那么导入`Trait` 会突然破坏代码,因为那样它无疑是模棱两可的。 (5认同)