2016-11-26 63 views
1

我想创建一个包含函数的特征,该函数返回一些内部数据的迭代器,然后可以通过不同的结构实现该特性。一个最小的例子如下:有没有办法让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); 
    } 
} 

然而,对于WrapperIterator类型是相当复杂的 - 从一个错误消息(经由类型不匹配创建)我发现它是:

std::iter::Map<std::slice::Iter<'_, u32>, [[email protected]:45:37: 45:43]> 

是否有一个让Rust为WrapperIterator推断正确类型的方法?

+0

惯用锈病将有函数体只是'self.data.iter()地图(|&X | X)' - 没有'return',没有';'。 – Shepmaster

回答

1

有没有办法让Rust为WrapperIterator导出正确的类型?

号其实,这是直接的什么锈则正好相反。你注释函数参数和返回类型,然后编译器可以根据推断的类型。

从方法主体中推断顶级类型会导致可怕的错误消息,这些错误消息远离产生它们的位置。 Haskell很难学会这一点,现在主张所有的顶级函数都有明确的类型签名。 Rust选择永远不要走这条路。另见this answer;虽然它谈论生命时间,但许多相同的观点仍然存在。

你没有提出的问题(我怎么返回此迭代器)已经有很多重复:

感谢您问另一个确切的重复。

相关问题