我正在尝试创建一个特征,其中包括在一些内部数据上返回迭代器的函数,然后可以由不同的结构实现。一个最小的例子如下:
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?
有没有办法让 Rust 派生出正确的类型
WrapperIterator?
不。事实上,这与 Rust 的做法恰恰相反。您注释函数参数和返回类型,然后编译器可以据此推断方法内的类型。
从方法体推断顶级类型会导致可怕的错误消息,这些错误消息发生在远离引发错误的位置。Haskell 通过惨痛的教训认识到了这一点,现在提倡所有顶级函数都具有显式类型签名。Rust 选择永远不走这条路。另请参阅这个答案;虽然它谈论生命周期,但许多相同的观点仍然成立。
您未提出的问题(如何返回此迭代器)已经有许多重复项:
感谢您没有再询问完全相同的重复项。
| 归档时间: |
|
| 查看次数: |
1279 次 |
| 最近记录: |