如何解决返回 Rc<RefCell<&'a mut [u8]>> 内的引用
基于这个 https://stackoverflow.com/a/68174563/10116440 我有一个可以保存引用的类型,但也可以被克隆。克隆只是为了能够调用一个闭包 dyn Fn
重复移动这种类型。
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),}
}
}
我在如何将内部类型作为引用访问时遇到错误:
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
我不明白为什么。实际上,当我调用 Ref
时,我正在创建一个临时 slice.borrow_mut()
,但我没有返回对此 Ref
的引用,而是返回对 Ref
内部内容的引用{1}},我使用 deref_mut()
访问。为什么会出现临时值错误?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。