分配给借用变量如何违反引用规则?

2023-12-26

我有这个代码:

struct Foo<'a> {
    link: &'a i32,
}

fn main() {
    let mut x = 33;
    println!("x:{}", x);
    let ff = Foo { link: &x };
    x = 22;
}

这会生成此编译器错误:

error[E0506]: cannot assign to `x` because it is borrowed
 --> src/main.rs:9:5
  |
8 |     let ff = Foo { link: &x };
  |                           - borrow of `x` occurs here
9 |     x = 22;
  |     ^^^^^^ assignment to borrowed `x` occurs here

Rust 书中只有两条规则:

  1. 一个或多个参考文献(&T) 到资源,
  2. 恰好有一个可变引用(&mut T).

我有一个可变变量和一个不可变链接。为什么编译器会报错呢?


Rust 编程语言 https://doc.rust-lang.org/stable/book/定义参考文献规则 https://doc.rust-lang.org/stable/book/ch04-02-references-and-borrowing.html#the-rules-of-references:

  • 在任何给定时间,您可以拥有一个可变引用或任意数量的不可变引用。
  • 参考文献必须始终有效。

隐式重新分配变量需要可变引用:

fn main() {
    let mut x = 33;
    let link = &x;
    x = 22;
    *(&mut x) = 22; // Basically the same thing
}

重要的是,重新分配变量mutates变量,这会导致不可变的参考link改变,这是不允许的。

请注意,变量的初始赋值并不not要求变量是可变的:

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

分配给借用变量如何违反引用规则? 的相关文章

随机推荐

  • 通过模板参数给定其长度,在编译时生成相同类型的 std::tuple

    在 C 中 如何实现带有指示元组长度的 int 模板参数的函数并生成具有该长度的 std tuple E g func lt 2 gt returns std tuple
  • 闪亮应用程序的 renderDataTable 中的列宽度,无需拉伸

    我想要一个数据表 及其所有排名 搜索和页面功能 它不会完全延伸到整个页面 并导致每列中有大量空白 理想情况下 列宽类似于 wrap 样式renderTable 我知道我可以修复相对列宽 但是 我的表将根据所选输入动态更新不同数量的列 我希望
  • 使用 FMOD 将输出保存到磁盘

    我正在使用 FMOD 播放一些声音 我想将生成的混音保存到磁盘 我一直在尝试 system gt recordStart 0 sound true 路径 但这保存了设备的麦克风输入 以某种方式 我想将扬声器输出重定向到磁盘 谢谢 Marc
  • XML 架构 - “此上下文中不支持元素”

    我的代码中的最后内容有问题 它说 http www w3 org 2001 XMLSchema http www w3 org 2001 XMLSchema 在这种情况下不支持 我该如何解决这个问题 问题截图
  • d3:Multi-Foci Force关键代码组件理解

    多焦点力的真正魔力就在这里完成 function tick e var k 1 e alpha Push nodes toward their designated focus nodes forEach function o i o y
  • 使用 Java JSch 确定来自 SFTP 服务器的最新文件

    有没有办法使用 Java JSch 确定 Unix SFTP 服务器上最新文件的名称 我想将最新文件从服务器复制到本地计算机 我已经有一个工作代码了 但我无法识别最新的文件 该文件夹包含许多以下格式的文件 Some Report dd MM
  • ios7 CameraPickerController 相机中的图像被冻结

    我有一个简单的相机视图控制器代码 UIImagePickerController picker new UIImagePickerController picker PrefersStatusBarHidden picker SourceT
  • 如何使用 JSF 显示/隐藏组件?

    如何使用 JSF 显示 隐藏组件 我目前正在尝试在 javascript 的帮助下做同样的事情 但没有成功 我无法使用任何第三方库 谢谢 阿比 你实际上可以做到这一点withoutJavaScript 仅使用 JSFrendered属性 通
  • 两个单精度浮点向量的点积在 CUDA 内核中与在主机上产生不同的结果

    在调试一些 CUDA 代码时 我使用以下方法与等效的 CPU 代码进行比较printf陈述 并注意到在某些情况下我的结果有所不同 它们在任何一个平台上都不一定是错误的 因为它们在浮点舍入误差之内 但我仍然有兴趣知道是什么导致了这种差异 我能
  • 如何禁用 Kendo UI 调度程序中的事件?我只是将其设为只读

    如何禁用kendo UI调度程序中的事件 我从官网示例中研究了示例 发现事件中的所有单元格都有双击事件来创建和删除以及其他事件 但现在我只是用它来显示结果 那么如何阻止所有的创建 删除 编辑事件呢 Use the editable配置选项
  • 获取连接的条带账户的账户ID

    当我运行测试以连接用户通过我的应用程序接受付款时 我将需要帐户 ID 来向他们的帐户收费 Stripe Token create array customer gt CUSTOMER ID card gt CARD ID array str
  • Rails & Devise:如何验证特定用户?

    我第一次将 Devise 与 Rails 结合使用 但遇到了一件事 我使用了提供的authenticate user 我的用户控制器中的方法来限制对页面的访问 如下所示 before filter authenticate user onl
  • 使用完全 REST Web 服务将数据写入数据库

    如何创建 REST Web 服务来将一行写入数据库表中 使用以下场景 该表称为Customer 这 要插入到行中的数据将 是姓名 地址 电话 号码 电子邮件 我认为用 Java 或 C 来描述整个事情是不可能的 我也不会想到这一点 但在我准
  • 游戏 Screeps - IDE 集成

    我正在玩 蠕虫 http screeps com http screeps com 模拟室模式 我一直在测试一些脚本 我不想只将它们保存到本地浏览器 我想使用 IDE 来开发代码并将其推送到我的 github 帐户 有可能做到吗 到目前为止
  • MSI:为什么当其他CPU要覆盖该行时我们需要写回该行?

    在 Hennessy Patterson 所著的 计算机架构 一书中 第 5 版 第 360 页 他们描述了 MSI 协议 并写道 如果线路处于 独占 已修改 状态 则在从总线接收到 写入未命中 时 当前 CPU 1 将该线路写回总线 然后
  • Delphi:框架属性在我期望的时候没有更新(它们被卡住了)

    我在表格上有一个框架 当我更改框架 添加 删除按钮 标签 时 表单上不会出现任何更改 或者控件在表单中具有框架中的其他位置 如果要从表单中删除框架并再次添加 gt 确定 为什么 我记得在 Delphi 2010 现在的 Delphi XE
  • 如何在Python3.5虚拟环境中安装scipy |视窗 10?

    我的 Windows 10 中有 Anaconda Python 3 6 其中包括 Scipy 我还使用虚拟 Python 3 5 环境来支持 TensorFlow 现在的问题是 当我在这个虚拟环境中时 我无法导入 Scipy 我努力了 p
  • 在 Homestead 中运行 Vagrant 的问题

    我尝试使用 Homestead box 设置虚拟机 我按照 Laravel 网站上的文档来设置 Homestead 当我运行命令时vagrant up 它似乎可以用于设置虚拟机 然后它要求运行vagrant provision 我就是这么做
  • 什么是内联 JavaScript? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我和我的程序员对于 内联 JavaScript 是什么有两种不同的看法 我说的内联 JavaScript 是指 JavaScript 直接放置在
  • 分配给借用变量如何违反引用规则?

    我有这个代码 struct Foo lt a gt link a i32 fn main let mut x 33 println x x let ff Foo link x x 22 这会生成此编译器错误 error E0506 cann