将Vec作为迭代器传递以在锈中起作用

问题描述 投票:0回答:2

我正在尝试学习锈,并且无法绕过将迭代器传递给函数。

我想做什么:

我有一个包含另一个结构的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.....
   ...
}
rust
2个回答
2
投票

您需要特征绑定为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


0
投票

我通过以下方式解决了它:

© www.soinside.com 2019 - 2024. All rights reserved.