Я пытаюсь реализовать простой синтаксический анализатор для потока байтов.
У меня возникают проблемы, когда я хочу повторно использовать объявленную ранее переменную,
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, но с кодом, показанным выше, я получаю следующую ошибку при компиляции:
error [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());
Я не понимаю, почему ... я хочу использовать переменную вместо того, чтобы объявить ее снова ...
Я пытался с некоторыми примерами / проблемами, связанными с переменным временем жизни, но я не получил решение для моего случая ... и решение, которое я нашел, я не понимаю полностью ...