我有一个问题,我有一个函数,接受一个特定结构类型的Iterator
,我想发送我的Vector包含相同的struct-type作为参数的函数。
我不明白我做错了什么。我尝试过几种不同的东西:
vecName.iter()
留给我这个error: error[E0271]: type mismatch resolving <std::slice::Iter<'_, code_test_lib::gfx::AsteroidDrawData> as std::iter::Iterator>::Item == code_test_lib::gfx::AsteroidDrawData
vecName.into_iter()
留给我这个error: error[E0507]: cannot move out of borrowed content
&vecName.iter()
给我这个error: error[E0277]: &std::slice::Iter<'_, code_test_lib::gfx::AsteroidDrawData> is not an iterator
&vecName.into_iter()
给我这个:error[E0277]: &std::vec::IntoIter<code_test_lib::gfx::AsteroidDrawData> is not an iterator
我不知道如何将Vec
作为Iterator
发送给函数。
pub struct MyStruct {
pub dataA: f32,
pub dataB: f32,
}
struct MyProgram {
my_structs: Vec<MyStruct>,
}
pub trait BaseFunctions {
fn new() -> Self;
fn run(&mut self);
}
impl BaseFunctions for MyProgram {
fn new() -> Self {
//Create some data
let mut vec = Vec::new();
for x in 0..5 {
vec.push(MyStruct{
dataA: 1.0,
dataB: 1.0,
});
}
Self {
my_structs: vec,
}
}
fn run(&mut self) {
my_func(
self.my_structs.into_iter(),
);
}
}
pub fn my_func<Iter>(iter: Iter)
where
Iter: Iterator<Item = MyStruct>, {
for i in iter {
// Do something
}
}
fn main() {
let mut program = MyProgram::new();
program.run();
}
你的问题是iter()
在引用时产生的Iterator
而不是值。因此,您需要为函数提供引用和生命周期。最好在IntoIterator
上设置一个允许更多通用性的界限。
pub fn my_func<'a, Iter>(iter: Iter)
where
Iter: IntoIterator<Item = &'a MyStruct>,
{
for i in iter {
// Do something
}
}
像这样的my_func(&self.my_structs);
或my_func(self.my_structs.iter());