我对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;
}
}
1条答案
按热度按时间kyvafyod1#
Packet
没有自己的变量。to_owned()
来自标准库中的blanketToOwned
实现,它是为任何实现Clone
的东西实现的。奇怪的是,此类型实现Clone
,但不实现Copy
。无论如何,
Packet
只保存了两个引用,克隆复制了这些引用,所以这实际上对借用或它们的生存期没有做任何有意义的事情。相反,考虑实现自己的“自有数据包”类型,该类型拥有自己的数据:
现在,您可以将双端队列更改为
VecDeque<OwnedPacket>
,并在推送数据包以执行复制时调用packet.into()
。