rust 在循环的上一次迭代中,“变量”在此处被可变借用

blmhpbnm  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(116)

我对Rust还是个新手,我一直在尝试解决代码中的一个错误。

但是,如果我取消注解该行以向缓冲区添加数据包,它会抛出错误:

`interface` was mutably borrowed here in the previous iteration of the loop

怎么做呢?在这一点上它和数据包一点关系都没有。我以为我已经开始掌握引用和内存管理的概念了,但是这让我不得不重新考虑所有的事情...

let mut buffer: VecDeque<pcap::Packet> = VecDeque::with_capacity(1000);
        while let Ok(packet) = interface.next_packet() {
            if start_time.is_none() {
                start_time = Some(Instant::now());
            }

            let buf_packet = packet.to_owned();

            // buffer.push_back(buf_packet);

            let elapsed = start_time.unwrap().elapsed();
            if elapsed >= time_limit {
                break;
            }
        }
kyvafyod

kyvafyod1#

Packet没有自己的变量。to_owned()来自标准库中的blanket ToOwned实现,它是为任何实现Clone的东西实现的。奇怪的是,此类型实现Clone,但不实现Copy
无论如何,Packet只保存了两个引用,克隆复制了这些引用,所以这实际上对借用或它们的生存期没有做任何有意义的事情。
相反,考虑实现自己的“自有数据包”类型,该类型拥有自己的数据:

struct OwnedPacket {
    pub header: PacketHeader,
    pub data: Vec<u8>,
}

impl<'a> From<Packet<'a>> for OwnedPacket {
    fn from(other: Packet<'a>) -> Self {
        Self {
            header: *other.header,
            data: other.data.into(),
        }
    }
}

现在,您可以将双端队列更改为VecDeque<OwnedPacket>,并在推送数据包以执行复制时调用packet.into()

相关问题