Передайте Vec в качестве итератора, чтобы работать в ржавчине - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь изучить ржавчину, и я не могу обойтись передачей итератора в функцию.

Что я хочу сделать:

У меня есть структура, которая включает в себя 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.....
   ...
}

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Вам нужна граница черты Iterator<Item = &OtherStruct>, так как Vec<T>::iter возвращает итератор с ссылками на 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)
    }
}

Полный пример на игровой площадке .

Наконец, стоит отметить, что в целомпредпочтительно запрашивать IntoIterator, а не Iterator. Поскольку Iterator реализует IntoIterator, такая функция будет продолжать принимать итераторы, но также будет принимать объекты, которые могут быть преобразованы в итераторы. В этом случае он будет принимать &s.data в дополнение к s.data.iter().

0 голосов
/ 09 ноября 2019

Я решил это:

callFunctionHere(data.iter().map(|i| OtherStruct{
    d: i.d
})
´´´
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...