如何正确访问 RefCell 中的值

2023-12-28

我试着把头扭过来Rc and RefCell在铁锈中。我想要实现的是对同一对象有多个可变引用。

我想出了这个虚拟代码:

use std::rc::Rc;
use std::cell::RefCell;

struct Person {
    name: String,
    mother: Option<Rc<RefCell<Person>>>,
    father: Option<Rc<RefCell<Person>>>,
    partner: Option<Rc<RefCell<Person>>>
}

pub fn main () {

    let mut susan = Person {
        name: "Susan".to_string(),
        mother: None,
        father: None,
        partner: None
    };

    let mut boxed_susan = Rc::new(RefCell::new(susan));

    let mut john = Person {
        name: "John".to_string(),
        mother: None,
        father: None,
        partner: Some(boxed_susan.clone())
    };

    let mut boxed_john = Rc::new(RefCell::new(john));

    let mut fred = Person {
        name: "Fred".to_string(),
        mother: Some(boxed_susan.clone()),
        father: Some(boxed_john.clone()),
        partner: None
    };

    fred.mother.unwrap().borrow_mut().name = "Susana".to_string();

    println!("{}", boxed_susan.borrow().name);

    // boxed_john.borrow().partner.unwrap().borrow_mut().name = "Susanna".to_string();
    // println!("{}", boxed_susan.borrow().name);

}

最有趣的部分是:

    fred.mother.unwrap().borrow_mut().name = "Susana".to_string();
    println!("{}", boxed_susan.borrow().name)

我更改了 Freds 母亲的名字,然后打印出 Susan 的名字,这应该是完全相同的引用。令人惊讶的是,它打印出了“Susana”,所以我假设我共享可变引用的小实验是成功的。

然而,现在我想再次改变它,这次以约翰的伙伴身份访问它,这也应该是完全相同的实例。

不幸的是,当我评论以下两行时:

// boxed_john.borrow().partner.unwrap().borrow_mut().name = "Susanna".to_string();
// println!("{}", boxed_susan.borrow().name);

我遇到了我的老朋友cannot move out of dereference of&-pointer。我在这里做错了什么?


这将修复它:

boxed_john.borrow().partner.as_ref().unwrap().borrow_mut().name = "Susanna".to_string();

问题是unwrap() on the Option<Rc<RefCell>>,它消耗了选项(即移出它),但你只有一个借用的指针。这as_ref转换为Option(T) to Option(&T) and unwrap将其转换为&T,避免任何动作。

另请注意:您的变量的可变性比它们真正需要的要多得多。但我确信您已经看到了编译器的警告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确访问 RefCell 中的值 的相关文章

随机推荐

  • 适用于 Android 的 WebP [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有关于如何在 Android 上使用 WebP 的示例吗 我试图获取 webp 图像列表并在带有图像视
  • $_SERVER['REMOTE_ADDR'] 可信吗?

    我有一个网站 只有几个人可以访问 所以登录的IP数量非常有限 登录的 管理员 提交的所有内容都会发送到取决于其 IP 地址的特定文件夹 同样 他们无法通过代理或任何其他方式访问该网站 因为允许的 IP 范围有限 我可以信任吗 SERVER
  • PHP fputcsv 编码

    我使用 fputcsv 创建 csv 文件 我希望 csv 文件位于 windows1251 ecnding 中 但找不到解决办法 我怎样才能做到这一点 干杯 Excel 文件的默认编码是机器特定的 ANSI 主要是windows1252
  • 如何更改苹果地图(MKMapView)背景颜色?

    我需要一个带有黑色主题的 iOS 应用程序 并且非常想让显示的 Apple 地图也为黑色 我在本机文档中没有看到任何有关更改 MKMapView 外观的内容 我用 Google 搜索了该主题并尝试更改 MKOverlayView 但是 我找
  • 如何在不停机的情况下将自定义域从一个 Firebase 项目移动到另一个项目?

    我有一个 firebase 项目 通过自定义域为实时用户提供服务 我需要将自定义域移动到在不同的 Firebase 项目中运行的新版本的应用程序 如果我删除自定义域并将其添加到另一个 Firebase 项目中 需要多长时间才能反映更改 如何
  • 正则表达式使用 regex_search 获取各种结果

    我只想获取给定字符串的结果 include
  • Microsoft Git Provider 和 Visual Studio 2012 无法启动配置的比较工具

    我正在使用最新的 Visual Studio 2012 Update 2 并且我已经安装了官方适用于 Git 的 Visual Studio 工具 https marketplace visualstudio com items itemN
  • 当我移动相机时,纹理的边界上会出现白线(或空格)。 Java、OpenGL

    纹理绘制不正确 正如我所看到的 程序改变了像素的顶线和底线 它会更改左列与右列 如果纹理是空的 比方说 在顶部 但底部有黑色像素 当您向上或向下 移动相机 时 您会看到底线变空 顶线时不时变黑 因此 当您向左或向右移动时 它也会更改列 为了
  • Android EditText,软键盘显示/隐藏事件?

    是否可以捕获 EditText 的软键盘显示或隐藏的事件 您好 我使用了以下解决方法 至于我的内容视图是 LinearLayout 的子类 可以是任何其他视图或视图组 我会重写 onMeasure 方法 如下所示 Override prot
  • PySpark dataframe - 如何将字符串变量传递给 df.where() 条件

    我不确定这在 pyspark 中是否可行 我相信这应该只是我没有在这里获胜 要求 引入 FNAME 和 LNAME 为 null 或 0 的任何记录 预期结果 结果是前两行 df sqlContext read format com dat
  • 自定义导航标题偏移 ios 11

    我有一个自定义导航项标题 它只是两个标签 一个在另一个之上 从 xib 文件加载 它是通过调用以下方法加载的 class Utilities Title and subtitle format custom title in Navigat
  • 实体框架 3.5 中的左连接

    我正在尝试在实体框架 3 5 上进行左连接 但我无法这样做 from i in from ta in context test attempt join uf in context user flag on ta users USERID
  • 给房产最好的命名? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android使用AsyncListDiffer时如何对RecyclerView列表进行排序?

    我有一个显示 CardView 列表的 RecyclerView 我最近将项目从使用 RecyclerView 适配器切换为使用 AsyncListDiffer 适配器 以利用后台线程上的适配器更新 我已经转换了列表的所有以前的 CRUD
  • SOAP 信封中的 WCF 和输入参数顺序

    我在使用 webHttpBinding soap 1 1 的 WCF Web 服务中遇到 对象引用未设置为对象实例 错误 我注意到 如果您按特定顺序输入参数 则不会引发错误 i e
  • 如何从另一个网站抓取特定 DIV 并将其加载到我的网站?

    我找了又找 似乎找不到我想要的东西 我不是最擅长 javascript 所以现在我寻求帮助 我用JQuery在我的网站上 我希望能够从类似网站调用 body 或 item 等特定元素NewEgg or Walmart or Bestbuy
  • 帮助 K&R 计算字符示例

    我正在阅读 K R 的第二版 我被这个看似简单的例子难住了 include
  • arraylist并发修改[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在用
  • 交叉连接同一个表中的 N 组行

    我有一个通用的 Dimension 和 DimensionMember 表 CREATE TABLE dbo Dimension ID int NOT NULL IDENTITY 1 1 Label nvarchar 255 CREATE
  • 如何正确访问 RefCell 中的值

    我试着把头扭过来Rc and RefCell在铁锈中 我想要实现的是对同一对象有多个可变引用 我想出了这个虚拟代码 use std rc Rc use std cell RefCell struct Person name String m