У меня есть простая структура, которая определяет какое-то сообщение для отправки по сети.
struct Message {
message_type: u32,
user_id: u32,
message: Vec<u8>,
}
И где-то еще я хочу сериализовать его в простую последовательность байтов. Поэтому я определил итератор для байтов сообщения следующим образом:
impl Message {
fn iter(&self) -> std::iter::Chain<std::iter::Chain<std::slice::Iter<'_, u8>, std::slice::Iter<'_, u8>>, std::slice::Iter<'_, u8>> {
self.message_type
.to_be_bytes()
.iter()
.chain(self.user_id.to_be_bytes().iter())
.chain(self.message.iter())
}
fn data(&self) -> Vec<u8> {
self.iter().cloned().collect()
}
}
Да, число итераторов в цепочке растет, и это немного обидно
Но я получаю 2 ошибки компилятора, когда пытаюсь запустить его.
cannot return value referencing temporary value
returns a value referencing data owned by the current function. rustc(E0515)
Думаю, я недостаточно разбираюсь в системе владения ржавчиной.
impl Iterator<Item=u8>
в качестве возвращаемого типа. (может быть, не для вашего случая, но запомните это как ярлык) - person Stargateur   schedule 17.05.2020