我正在尝试学习锈,并且无法绕过将迭代器传递给函数。
我想做什么:
我有一个包含另一个结构的vec的结构。
我将不时更新此vec
我想将此vec作为迭代器传递给另一个函数
以下是我想做的事情的简短代码片段,但是我无法将其编译为我所做的任何事情。谁能帮我解释一下如何做到这一点?我可以将数据作为某种新的复制对象传递吗?
Struct Main {
data: Vec<OtherStruct>
}
callFunctionHere(self.data.iter());
pub fn callFunctionHere<I>(data: I)
where
I: Iterator<Item = OtherStruct>,
{
for i in data.....
...
}
您需要特征绑定为Iterator<Item = &OtherStruct>
,因为Vec<T>::iter
通过references返回到T
的迭代器。产生T
值的迭代器必须将其移出向量,只有当向量本身被消耗时,这才是安全的,并且Vec<T>::into_iter()
就是这样做。
请注意,您还需要指定引用的生存期,并与数据的生存期绑定:
fn some_function<'a, I>(data: I) where I: Iterator<Item = &'a Other> + 'a, { for el in data { println!("{:?}", el) } }
完整示例in the playground。
最后,值得指出的是,通常最好是请求IntoIterator
绑定而不是IntoIterator
。由于Iterator
实现了Iterator
,因此此类函数将继续接受迭代器,但还将接受可以转换为迭代器的对象。在这种情况下,除了IntoIterator
之外,它还将接受&s.data
。
我通过以下方式解决了它: