微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回 Rc<RefCell<&'a mut [u8]>> 内的引用

如何解决返回 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),}
    }
}

Playground

我在如何将内部类型作为引用访问时遇到错误

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?