Как я могу отправить свой Vec в функцию, принимающую Iterator в качестве параметра? - PullRequest
2 голосов
/ 01 мая 2019

У меня проблема с тем, что у меня есть функция, которая принимает Iterator определенного типа структуры, и я хочу отправить свой вектор, который содержит этот же тип структуры, в качестве параметра функции.

Я не понимаю, что я делаю не так.Я пробовал несколько разных вещей:

  • Отправка 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 Ответ

2 голосов
/ 01 мая 2019

Ваша проблема в том, что 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());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...