Как я могу изменить тип в Rust & Mut Peekable <I>на & [u8]? - PullRequest
1 голос
/ 27 октября 2019

У меня вопрос об использовании типов при ржавчине. У меня есть значение с типом &mut Peekable<I>, и я хочу использовать его для ввода значения для другой функции, которая получает значение с типом &[u8]. Как я могу изменить его тип?

1 Ответ

1 голос
/ 01 ноября 2019

Peekable<I> - это итератор, который выдает элементы из итератора, который он переносит (с поворотом, который можно посмотреть вперед, но здесь это не актуально).

&[u8] - это фрагментбайты расположены в памяти непрерывно.

Итак, у вас есть две проблемы:

  1. Итератор I может быть любым. Предполагая, что вы получили I из общего контекста, такого как foo<I: Iterator>(), вам нужно убедиться, что итератор дает u8 или что-то, что можно преобразовать в u8.

  2. Данныепозади Peekable не должно существовать в памяти. Он может быть создан из диапазона, например, (0..1000) или итерацией по HashMap, в котором данные разбросаны случайным образом. Вам нужно скопировать его в вектор, который гарантирует непрерывное расположение.

Сначала вам нужно будет объявить, что вы хотите u8 с where I: Iterator<Item=u8>, или потребовать, чтобы тип был конвертируемым. до u8 с where I: Iterator<Item=impl Into<u8>>. Тогда вы сможете сделать let iterator = iterator.map(|el| el.into()), чтобы получить итератор u8 элементов.

И когда у вас есть это, вы можете собрать их в вектор и получить часть вектора:

let vec: Vec<u8> = iterator.collect();
let slice = &vec[..];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...