我正在尝试创建一个特性,其中包含一些函数,这些函数返回一些内部数据的迭代器,然后可以通过不同的结构实现 . 最小的例子如下:
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);
}
}
但是, WrapperIterator
的类型相当复杂 - 从错误消息(通过类型不匹配创建)我发现它是:
std::iter::Map<std::slice::Iter<'_, u32>, [closure@borrow.rs:45:37: 45:43]>
有没有办法让Rust推断 WrapperIterator
的正确类型?
1 回答
不,实际上,这与Rust的做法正好相反 . 您注释函数参数和返回类型,然后编译器可以基于此推断方法内部的类型 .
从方法体中推断出顶级类型会导致发生远离引起它们的位置的可怕错误消息 . Haskell以艰难的方式学习了这一点,现在主张所有顶级函数都有明确的类型签名 . 鲁斯特选择永远不会走那条路 . 另见this answer;虽然它谈到了生命周期,但许多相同的观点仍然存在 .
您未提出的问题(如何返回此迭代器)已经有很多重复:
Returning a closure from a function
Correct way to return an Iterator?
Return a map iterator which is using a closure in Rust
谢谢你没有要求另一个完全重复 .