如何将Vec发送到以Iterator作为参数的函数?

时间:2019-05-01 13:44:55

标签: vector rust iterator borrowing

我遇到一个问题,我有一个采用特定结构类型的Iterator的函数,我想将包含相同结构类型作为参数的Vector发送给我的Vector

我不明白我在做什么错。我尝试了几种不同的方法:

  • 发送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();
}

1 个答案:

答案 0 :(得分:2)

您的问题是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());

呼叫