有没有办法让 Rust 推断关联类型的正确类型?

Hen*_*ler 5 rust

我正在尝试创建一个特征,其中包括在一些内部数据上返回迭代器的函数,然后可以由不同的结构实现。一个最小的例子如下:

trait WrapperTrait {
    type WrapperIterator: Iterator<Item=u32>;
    fn iter(&self) -> Self::WrapperIterator;
}
struct Wrapper {
    data: Vec<u32>
}
impl WrapperTrait for Wrapper {
    type WrapperIterator = ...;
    fn iter(&self) -> Self::WrapperIterator {
        return self.data.iter().map(|&x| x);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是, for 的类型WrapperIterator相当复杂 - 从错误消息(通过类型不匹配创建)我发现它是:

std::iter::Map<std::slice::Iter<'_, u32>, [closure@borrow.rs:45:37: 45:43]>
Run Code Online (Sandbox Code Playgroud)

有没有办法让 Rust 推断出正确的类型WrapperIterator

She*_*ter 2

有没有办法让 Rust 派生出正确的类型WrapperIterator

不。事实上,这与 Rust 的做法恰恰相反。您注释函数参数和返回类型,然后编译器可以据此推断方法内的类型。

从方法体推断顶级类型会导致可怕的错误消息,这些错误消息发生在远离引发错误的位置。Haskell 通过惨痛的教训认识到了这一点,现在提倡所有顶级函数都具有显式类型签名。Rust 选择永远不走这条路。另请参阅这个答案;虽然它谈论生命周期,但许多相同的观点仍然成立。

您未提出的问题(如何返回此迭代器)已经有许多重复项:

感谢您没有再询问完全相同的重复项。

  • 链接的“重复项”似乎都没有涵盖实现特征的情况。 (3认同)