Я пытаюсь реализовать простой парсер для байтового потока.
У меня проблемы, когда я хочу повторно использовать объявленную ранее переменную,
fn read_data(asn_data: &mut Cursor<&[u8]>) -> Result<(u8, u8, Vec<u8>), Err> {
let total_len = asn_data.get_ref().len();
if total_len < 2 {
return Err(1);
}
let d_type = asn_data.read_u8().unwrap();
let d_len = asn_data.read_u8().unwrap();
if (asn_data.position() + d_len as u64) > total_len as u64 {
return Err(2);
}
let mut buf = vec![0; d_len as usize];
match asn_data.read_exact(&mut buf) {
Err(e) => Err(e),
Ok(()) => Ok((d_type, d_len, buf)),
}
}
fn parse_request(request: &[u8]) -> Option<u8> {
if request.len() == 0 {
return None;
}
let mut rdr = Cursor::new(request);
let data_tuple = read_data(&mut rdr).unwrap();
println!("{:02?}", data_tuple.2);
rdr = Cursor::new(data_tuple.2.as_slice());
let data_tuple = read_data(&mut rdr).unwrap();
println!("{:02x?}", data_tuple.2);
Some(1)
}
В функции parse_request я хочу повторно использовать переменную rdr, но с кодом, показанным выше, я получаю следующую ошибку при компиляции:
ошибка [E0597]:
data_tuple.2
не живет достаточно долго -> src / main.rs: 80: 23 | 80 | rdr = Cursor :: new (data_tuple.2.as_slice ()); | ^^^^^^^^^^^^ заемная стоимость не живет достаточно долго ... 104 | } | -data_tuple.2
упал сюда, пока все еще занимал | = примечание: значения в области удаляются в порядке, обратном их созданиюошибка: прерывание из-за предыдущей ошибки
Однако если я напишу "let mut", когда использую 2-ю переменную rdr, код компилируется и работает нормально ...
let mut rdr = Cursor::new(data_tuple.2.as_slice());
Я не понимаю, почему ... я хочу повторно использовать переменную вместо того, чтобы снова объявить ее ...
Я пробовал с некоторыми примерами / проблемами, связанными с переменным временем жизни, но я не нашел решения для моего случая ... и решение, которое я нашел, я не понимаю полностью ...
rdr
гарантирует, что он объявлен послеdata_tuple
, поэтому первое не сможет пережить второе. Если вы повторно используете переменную, порядок объявления будет обратным, поэтомуrdr
удаляется только послеdata_tuple
, отсюда и ошибка. - person Sven Marnach   schedule 22.10.2018Err
, который находится в области действия одновременно с одноименным вариантом перечисления? - person Sven Marnach   schedule 22.10.2018