借用亲子关系检查器

2023-11-29

我有下面的代码生成在其注释中标记的错误消息。我想我理解这个消息:我想借用父级两次:一次用于查找其子级,一次作为子级的参数(并且错误中的可变/不可变单词不相关)。我必须证明这一点Child修改后不会消失Parent。但我不知道该怎么做。我可以Rc<Child>除了那之外的一切都显得浪费,所以我希望增加一些生命周期就能达到目的。

struct Parent {
    used: i32,
    child: Child,
}

struct Child {
    dummy: i32,
}

impl Child { 
    fn use_parent(&mut self, parent: &mut Parent) {
        // use both child and parent
        parent.used += self.dummy;
        self.dummy += 1;
    }
}
fn main() {
    let parent = Parent {
        used: 0,
        child: Child {
            dummy: 1
        }
    };
    //Error: cannot borrow immutable local variable `parent` as mutable
    parent.child.use_parent(&mut parent);
}

并且错误中的可变/不可变单词不相关

我不知道你为什么这么想。可变性是very在 Rust 中很重要!例如,虽然允许您同时对不可变数据进行多个引用,但一次只允许对可变数据进行单个引用。

首先,您需要修复parent:

let mut parent = // ...

然后,您将从该行收到错误:

parent.child.use_parent(&mut parent);

当你运行这一行时,你就隐式可变地借用了parent and child。这样做是为了让您可以调用use_parent,这需要一个&mut self.

然而,你是also试图获取第二个可变引用作为参数!这是一个禁忌,因为如果你被允许拥有多个aliasing可变引用,编译器将无法跟踪它并确保您不会破坏内存安全保证。

假设我删除该行self.dummy+=1;所以只有 1 个可变别名 - 我可以让它工作吗?

让我们看看函数签名的一些变体

fn use_parent(&self, parent: &mut Parent)
// cannot borrow `parent` as mutable because `parent.child` is also borrowed as immutable

fn use_parent(&mut self, parent: &Parent)
// cannot borrow `parent` as immutable because `parent.child` is also borrowed as mutable

fn use_parent(&self, parent: &Parent)
// OK

正如我之前提到的,如果您对某物有可变引用,则不允许您拥有any对同一事物的其他引用(可变或不变)。

另外,请注意没关系方法的主体是什么! Rust 只检查被调用函数的签名来验证借用某些东西是否安全。

那么你如何尝试解决你的问题呢?最终,您正在尝试做一些编译器很难证明安全的事情。你想要一个graph的可变链接。我强烈建议阅读Rc 的模块文档其中有一个正是这种父子关系的例子。

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

借用亲子关系检查器 的相关文章

随机推荐

  • 根据浏览器语言在

    我是 HTML 新手 我想在禁用 JavaScript 时显示一条消息 所以我把消息放进去
  • 如何将字符数组转换为字符串?

    转换 C string使用 char 数组非常简单c str字符串的函数然后做strcpy 然而 如何反其道而行之呢 我有一个 char 数组 例如 char arr This is a test 转换回 string str This i
  • 在 Windows 中将 Bonjour (dns_sd.h) 库添加到 Qt

    我一直在尝试正确添加Apple提供的开源dns sd h库 我正在编写一个使用 BonjourRegistrar 类的程序 如下所示 链接文本 我已经在Mac环境上编写了我的程序 现在我正在尝试将其移植到Windows Bonjour SD
  • 在 Python 中将 .CSV 文件转换为 .DTA 文件

    我希望通过 Python 自动化将许多 CSV 文件转换为 DTA 文件的过程 DTA 文件是由 Stata 统计语言处理的文件类型 然而 我还没有找到一种方法来做到这一点 The R语言有写 dta 它允许将 R 中的数据帧转换为 dta
  • Qt 5.5 和 OpenGL:检索设备信息

    我编写了一个 Qt 5 5 应用程序 它以 QOpenGLWidget 的形式使用 OpenGL 现在我希望用户可以从应用程序中看到他们的设备信息 我的意思是 卡的名称 例如 GT 640 Vendor GPU 总内存 驱动版本 扩展列表
  • 检测没有磁盘空间iPhone SDK

    假设我需要将许多图像写入iPhone文件系统 我需要找到足够的空间将图像写入磁盘 可以使用iPhone SDK吗 对的 这是可能的 请参阅以下教程 使用强大的 google 搜索引擎找到 http iphoneincubator com b
  • 如何使用 insert_many 安全地忽略重复的键错误

    当将 insert many 与 pymongo 一起使用时 我需要忽略重复插入 其中重复项基于索引 我在 stackoverflow 上看到过这个问题 但没有看到有用的答案 这是我的代码片段 try results mongo conne
  • 如何使用 JSP/Java 检测移动设备(iOS 和 Android)?

    只是想知道是否有人遇到过这个 基本上 我希望使用 JSP 检测 iOS 和 Android 并能够有条件地将 CSS 和 JS 文件添加到页面 有任何想法吗 一个非常简单的解决方案是 由于 else 语句非常短 因此仅当您只提供 iOS 和
  • 从字符串名称在程序集中创建类实例

    我不确定这是否可行 而且我对在 C NET 中使用程序集还很陌生 我想做的是在提供该类的字符串名称时创建该类的实例 像这样的事情 using MyAssembly namespace MyNameSpace Class MyClass in
  • 设置关闭和断开 IBM MQ.NET 客户端的超时

    是否可以为以下代码设置超时时间 private MQQueueManager queueManager private MQQueue queue queue Close queueManager Disconnect 原因是有时连接在尝试
  • Spark Regexp:根据日期拆分列

    我的数据框中有一列称为 数据 如下所示 blah blah blah blah 10 7 17service 我想将其分成三个不同的列 如下所示 col1 blah blah blah blah col2 10 7 17 col3 serv
  • Android 1.5 中 onDateChanged() 中具有最大和最小日期的日期选择器?

    我正在 android 1 5 中开发 DatePicker 我正在尝试设置最大和最小日期 最小日期应该是当前日期 最大日期应该是我将从字符串中提供的日期 如 maxYear maxMonth maxDay 假设今天的日期 30 12 20
  • 如何释放本地 Windows 上的 80 端口?

    我安装了 XAMPP 1 6 8 但由于某种原因它不起作用 后来发现80端口没有空闲或者没有监听 我怎样才能释放它或使其免费 多谢 我发现接管80端口的是http api服务 我在cmd中写道 net stop http 问我 以下服务将停
  • 使用 MVVM Light 和 DispatcherHelper 进行单元测试

    我有一个使用 MVVM Light Toolkit 的 SL4 应用程序 在视图模型中 我调用从 OData 服务检索数据的数据服务 在 VM 中 我使用 DispatcherHelper 实用程序类 MVVM Light 的一部分 根据传
  • 输出UTF-16?有点卡住了

    我有一些代理对形式的 UTF 16 编码字符 我想将这些代理对作为字符输出在屏幕上 有谁知道这怎么可能 iconv UTF 16 UTF 8 yourString
  • HTML 文档中的名称属性必须是唯一的吗?

    我记得有一次在规范中读到id属性和name属性共享相同的命名空间并且必须是唯一的 从今以后 我一直试图在我的申请中满足这一要求 甚至害怕给出同样的要求id and name到同一个元素 但最近我开始使用 ASP NET MVC 3 它 像
  • 当没有名称列时(或者当应该创建名称列时)

    我正在尝试将数据从长变为宽 但在这里我需要创建名称列 例如 event1 event2 event3 等 换句话说 没有自然的候选者names from争论 我尝试了几种不同的方法 但无法得到我正在寻找的东西 这是一个可重现的例子 set
  • glDrawArrays 仅在我退出时更新

    我在 python3 中有这段代码 它不能在 Windows 机器上运行 但可以在 Linux 机器上运行 我绘制了一个绿色屏幕和一个红色三角形 但红色三角形仅在我退出时出现 import pygame import numpy impor
  • Scala 扩展双箭头

    我正在看Anorm 源代码和RowParser trait它有这样的声明 trait RowParser A extends Row gt SqlResult A 我很好奇什么类型 Row gt SqlResult A 是 我在任何地方都找
  • 借用亲子关系检查器

    我有下面的代码生成在其注释中标记的错误消息 我想我理解这个消息 我想借用父级两次 一次用于查找其子级 一次作为子级的参数 并且错误中的可变 不可变单词不相关 我必须证明这一点Child修改后不会消失Parent 但我不知道该怎么做 我可以R