Based on this https://stackoverflow.com/a/68174563/10116440 I have a type that can hold references, but can be cloned also. The clone is just for being able to call a closure dyn Fn
that moves this type repeated times.
use std::cell::RefCell;
use std::ops::Deref;
use std::ops::DerefMut;
use std::rc::Rc;
use std::vec::Vec;
#[derive(Debug)]
pub enum EncodedPacketError {
NotOwned,
NotMutable,
}
#[derive(Clone)]
pub enum EncodedPacket<'a> {
Owned(Vec<u8>),
Ref(Rc<&'a [u8]>),
RefMut(Rc<RefCell<&'a mut [u8]>>),
}
impl<'a> EncodedPacket<'a> {
pub fn slice(&'a self) -> &'a [u8] {
match self {
EncodedPacket::Owned(vec) => vec.as_slice(),
EncodedPacket::Ref(slice) => slice,
EncodedPacket::RefMut(slice) => slice.borrow().deref(),
}
}
pub fn slice_mut(&'a mut self) -> Result<&'a mut [u8], EncodedPacketError> {
match self {
EncodedPacket::Owned(ref mut vec) => Ok(vec.as_mut_slice()),
EncodedPacket::Ref(_) => Err(EncodedPacketError::NotMutable),
EncodedPacket::RefMut(slice) => Ok(slice.borrow_mut().deref_mut()),
}
}
pub fn vec_ref(&'a self) -> Result<&'a Vec<u8>, EncodedPacketError> {
match self {
EncodedPacket::Owned(vec) => Ok(&vec),
EncodedPacket::Ref(slice) => Err(EncodedPacketError::NotOwned),
EncodedPacket::RefMut(slice) => Err(EncodedPacketError::NotOwned),
}
}
pub fn vec_ref_mut(&'a mut self) -> Result<&'a Vec<u8>, EncodedPacketError> {
match self {
EncodedPacket::Owned(vec) => Ok(vec),
EncodedPacket::Ref(slice) => Err(EncodedPacketError::NotOwned),
EncodedPacket::RefMut(slice) => Err(EncodedPacketError::NotOwned),
}
}
}
I'm having errors on how to access the inner types as references:
error[E0515]: cannot return value referencing temporary value
--> src/lib.rs:22:9
|
22 | / match self {
23 | | EncodedPacket::Owned(vec) => vec.as_slice(),
24 | | EncodedPacket::Ref(slice) => slice,
25 | | EncodedPacket::RefMut(slice) => slice.borrow().deref(),
| | -------------- temporary value created here
26 | | }
| |_________^ returns a value referencing data owned by the current function
error[E0515]: cannot return value referencing temporary value
--> src/lib.rs:33:45
|
33 | EncodedPacket::RefMut(slice) => Ok(slice.borrow_mut().deref_mut()),
| ^^^------------------^^^^^^^^^^^^^
| | |
| | temporary value created here
| returns a value referencing data owned by the current function
I don't understand why. Indeed, I'm creating a temporary Ref
when I call slice.borrow_mut()
, but I'm not returning a reference to this Ref
, I'm returning a reference to what's inside of the Ref
, which I access using deref_mut()
. Why do I get temporary value error?