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

有没有办法让Rust推断出关联类型的正确类型?,rust,Rust,我试图创建一个trait,其中包含一些函数,这些函数返回一些内部数据的迭代器,然后可以由不同的结构实现。下面是一个简单的例子: trait WrapperTrait { type WrapperIterator: Iterator<Item=u32>; fn iter(&self) -> Self::WrapperIterator; } struct Wrapper { data: Vec<u32> } impl WrapperTra

我试图创建一个trait,其中包含一些函数,这些函数返回一些内部数据的迭代器,然后可以由不同的结构实现。下面是一个简单的例子:

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);
    }
}
有没有办法让Rust推断出
包装迭代器的正确类型

有没有办法让Rust为
包装迭代器
派生正确的类型

不。事实上,这与生锈的作用正好相反。对函数参数和返回类型进行注释,然后编译器可以根据注释推断方法内部的类型

从方法主体推断顶级类型会导致可怕的错误消息,这些错误消息发生在远离导致它们的位置的地方。Haskell以艰苦的方式学会了这一点,现在主张所有顶级函数都具有显式类型签名。Rust选择了永远不走那条路。另见;当它谈到生命时,许多相同的观点都成立

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


感谢您不再询问另一个精确的副本。

不幸的是,这在stable rust中还不可能实现,但有必要引入此功能。如果您想尝试(当前不稳定的)功能,您可以使用
#每晚在rust上尝试![特征(最小类型、别名、特征)]
。您必须在trait中添加一个类型参数:

#![特征(最小类型、别名和特征)]
trait-WrapperTrait:Iterator;
fn iter Self::wrappertiterator=impl迭代器;

fn iter Self::WrapperIteratorIdiomatic Rust将使函数体仅为
Self.data.iter().map(|&x|x)
-no
return
,no
。所有链接的“重复项”似乎都没有涵盖实现特征的情况。链接的问题是让rust推断函数的返回类型,这是不同的。关于Haskell的回答中的自以为是的部分在这种情况下也不太合适。实际上,rust现在正致力于实现原始海报的目标:
std::iter::Map<std::slice::Iter<'_, u32>, [closure@borrow.rs:45:37: 45:43]>