On this example:
use std::sync::Arc;
trait DecodedPacket<'a> {}
struct ReferencePacket<'a> {
data: &'a [u8],
}
impl<'a> DecodedPacket<'a> for ReferencePacket<'a> {}
struct Decoder {}
impl Decoder {
pub fn receive<'a, 'b>(&self, on_packet: Arc<dyn Fn(&'b Box<dyn DecodedPacket<'a>>)>) {
let slice: &[u8] = &[0, 1, 2];
let reference_packet: Box<dyn DecodedPacket<'a>> =
Box::new(ReferencePacket { data: slice });
on_packet(&reference_packet);
}
}
I get:
error[E0759]: `on_packet` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
--> src/lib.rs:17:13
|
14 | pub fn receive<'a, 'b>(&self, on_packet: Arc<dyn Fn(&'b Box<dyn DecodedPacket<'a>>)>) {
| ------------------------------------------- this data with lifetime `'a`...
...
17 | Box::new(ReferencePacket { data: slice });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...is captured here...
18 |
19 | on_packet(&reference_packet);
| ----------------- ...and is required to live as long as `'static` here
I don't see any rule that specifies on_packet
should only accept 'static
lifetimes. I specifically made is such that 'a
is parametrized in the function, so it should be whatever the caller decides.
it looks like the problem is that the caller specifies the lifetimes, so since it doesn't know which Arc
I will pass, it prepares the function for the worst case possible which would be an Arc
with 'a
and 'b
being 'static
. Am I right?
Why is it that doing on_packet: Arc<dyn Fn(&dyn DecodedPacket<'_>)>
fixes the problem?