可变借用后的不可变引用

2023-12-03

每次使用 Rust 时,我都会遇到与所有权/借用相关的类似问题,因此这里是最简单的一段代码,它说明了我常见的问题:

use std::cell::RefCell;

struct Res {
    name: String,
}

impl Res {
    fn new(name: &str) -> Res {
        Res {
            name: name.to_string(),
        }
    }

    // I don't need all_res to be mutable
    fn normalize(&mut self, all_res: &Vec<Res>) {
        // [...] Iterate through all_res and update self.name
        self.name = "foo".to_string();
    }
}

fn main() {
    let res = RefCell::new(vec![Res::new("res1"), Res::new("res2")]);

    for r in res.borrow_mut().iter_mut() {
        // This panics at runtime saying it's
        // already borrowed (which makes sense, I guess).
        r.normalize(&*res.borrow());
    }
}

阅读完有关RefCell我认为这会起作用。它可以编译,但在运行时会出现恐慌。

如何在迭代同一向量时引用向量?有没有更好的数据结构可以让我做到这一点?


你的程序会因为你试图借用而发生恐慌Vec同时可变和不可变:这是不允许的。

你需要做的只是包裹Strings in RefCell。这允许您在迭代时改变字符串Vec.

use std::cell::RefCell;

struct Res {
    name: RefCell<String>,
}

impl Res {
    fn new(name: &str) -> Res {
        Res {
            name: RefCell::new(name.to_string()),
        }
    }

    // I don't need all_res to be mutable
    fn normalize(&self, all_res: &Vec<Res>) {
        // [...] Iterate through all_res and update self.name
        *self.name.borrow_mut() = "foo".to_string();
    }
}

fn main() {
    let res = vec![Res::new("res1"), Res::new("res2")];

    for r in res.iter() {
        r.normalize(&res);
    }

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

可变借用后的不可变引用 的相关文章

随机推荐

  • 从 googlechrome 扩展获取页面的源代码

    我正在为 googlechrome 编写一个扩展 以显示网站中的项目列表 我遇到的问题是我无法获取我正在寻找的页面的源代码 当我尝试将其放入 iframe 中时 它的代码会更改窗口的位置 XMLhttpRequest 也只允许在您自己的域中
  • 在 Scala 中,为什么我不能实现这样一个简单的通用函数?

    我想要一个名为 double 的通用函数 其行为如下 可以应用于任何类型def x T T method double A gt AA double 1 gt 2 double 0 2 gt 0 4 所以我这样写这个函数 def doubl
  • 为什么 Pytesseract 无法识别黑底白字?

    我有很多像下面这样的图像 我需要使用 pytesseract 来抓取白色文本 我使用以下代码 但结果并不令人印象深刻 import pytesseract from PIL import Image pytesseract pytesser
  • 分组和连接元组列表

    我有一个对 key val 的列表 其中键和值都是字符串 我想聚合具有重复键的元组 For key1 val1 key2 val2 key3 val3 key1 val4 key2 val5 我要输出 key1 val1 val4 key2
  • 如何将整数编码为其他整数?

    作为后续将 2 个 4 位数字存储在 1 个 8 位数字中 我想知道是否有一个概括 您可以将 n 个 x 位数字存储到 m 个 y 位数字中 例如 也许您可 以将 5 个 8 位数字存储为 3 个 15 位数字 或者可能将 2 个 8 位数
  • 在OpenGL中绘制“点状”形状,与缩放无关

    我正在使用 Qt 和 QWt3D 绘图工具 并扩展它们以提供我需要的一些 3D 和 2D 绘图功能 因此我在此过程中学习了一些 OpenGL 我目前可以使用 OpenGL 绘制点 但只能绘制为圆形 或通过关闭抗锯齿功能绘制为 正方形 这些点
  • Java 不遵循代码? [复制]

    这个问题在这里已经有答案了 这是我认为不遵循代码应该执行的操作的代码片段 public void updateTimeElapsed timeElapsedLabel setText Time elapsed System nanoTime
  • 类成员的使用声明应为成员声明 (C++2003)

    第 7 3 3 段 C 2003 标准指出 类成员的使用声明应为成员声明 这意味着以下给出了语法错误 struct S1 static int var1 using S1 var1 虽然以下编译良好 namespace N2 int var
  • 警告:只有第一个字节会被分配给字符串偏移量

    以下代码在 PHP 7 中运行良好 为什么我在 PHP 8 中看到此警告 str xy str 0 bc 从 PHP 8 开始 尝试使用方数组括号样式替换具有多个字节的字符串偏移量将发出warning 所以你只需要删除多余的字节 c在这种情
  • Restlet - 使用路由器附加资源类时遇到问题

    使用 Restlet 2 1 0 Java SE 版本进行原型设计时 我在将 ServerResource 类映射到 url 时遇到问题 我已经使用 Router attach 方法尝试了很多变体 但没有任何效果 我当前的代码如下所示 pa
  • 按日期分组,当 count() 不产生任何行时为 0

    我正在使用 Postgresql 9 当没有计算行时 我正在与计数和分组作斗争 让我们假设以下架构 create table views date event timestamp with time zone event id intege
  • 如何在代码中进行检查以确保内核模块之间的依赖关系 - Linux Kernel?

    我有两个模块 我希望模块在执行 insmod 或 rmmod 时相互依赖 目前 我的 module2 依赖于 module1 如果我插入 module1 然后 module2 它工作正常 另一方面 反过来则行不通 这在解释上是合乎逻辑的 但
  • 检查 Python 中的字符串是否为“,”的精确形式

    我正在将两个整数组成的字符串转换为一个元组 我需要确保我的字符串的格式完全符合以下形式
  • CountDownTimer - 用户递增。问题

    我有一个关于 CountDownTimer 的问题 我必须制作一个应用程序 允许用户每次单击按钮时将时间时间增加 1 然后 在停止单击按钮后 它会等待三秒钟 然后开始倒计时 我在下面粘贴了我的代码 我的问题是 我似乎无法使数字递增正常工作
  • SWIFT:NSURLSession 将数据转换为字符串

    在我的 iPhone 应用程序 在 SWIFT 中开发 中 我必须与 https 服务 带有参数 进行通信 并且需要分析响应 一切正常 但在某些情况下注意到它没有得到预期的结果 进一步分析我发现这是将服务器响应数据转换为字符串的问题 NSD
  • 如何下载没有 nuget.exe 或 Visual Studio 扩展的 Nuget 包?

    如何下载 NuGet 包 我没有 NuGet Visual Studio 扩展或命令行程序 nuget exe 如何从网络下载 nupack 文件 据我了解 我将能够提取 dll从中获取文件 带有 7 zip 即可正常使用 我碰巧感兴趣的包
  • jQuery代码,看不懂

    我正在查看这段代码 由于我是网页设计的新手 我无法理解它 所以在我的索引页上我有一个谷歌的链接和ext js页面以下代码 这是我的理解 这是错误的 用户点击ok or cancel 因此变量c或者是ok or cancel 现在我不明白有什
  • 计算谷歌地图V3中两点之间的距离

    如何计算 Google 地图 V3 中两个标记之间的距离 类似于distanceFromV2 中的函数 Thanks 如果你想自己计算 那么你可以使用Haversine公式 var rad function x return x Math
  • PHP获取特定用户的数据

    现在我已经创建了一个带有会话的登录表单 我现在需要的是 当用户使用他的用户名和密码登录时 获取他的数据 例如姓名 关于等 并将其放在欢迎页面中 目前我已经创建了这段代码 但是这段代码获取了所有用户数据
  • 可变借用后的不可变引用

    每次使用 Rust 时 我都会遇到与所有权 借用相关的类似问题 因此这里是最简单的一段代码 它说明了我常见的问题 use std cell RefCell struct Res name String impl Res fn new nam