参考和盒子之间的可变性差异

2023-12-25

我试图了解 Rust 指针类型及其与可变性的关系。具体来说,声明一个保存指针且本身可变的变量的方法——即可以指向其他内存,并声明该变量数据本身是可变的——即可以改变through指针变量的值。

这就是我对简单引用工作方式的理解:

let mut a = &5; // a is a mutable pointer to immutable data
let b = &mut 5; // b is an immutable pointer to mutable data

So a可以更改为指向其他内容,同时b不能。然而,其中的数据b点 to 可以通过更改b,虽然无法通过a. 我的理解正确吗?

对于问题的第二部分——为什么Box::new似乎表现不同?这是我目前的理解:

let mut a = Box::new(5); // a is a mutable pointer to mutable data
let c = Box::new(7); // c is an immutable pointer to immutable data

new应该返回一个指向某些堆分配数据的指针,但它指向的数据似乎从保存指针的变量继承了可变性,这与引用的示例不同,其中这两种可变性状态是独立的!是这样吗Box::new应该可以工作吗?如果是这样,如何创建指向堆上存储在不可变变量中的可变数据的指针值?


首先,您确实了解引用如何正确运行。mut a是一个可变变量(或者,更准确地说,是一个可变绑定),而&mut 5是指向可变数据块的可变引用(它是在堆栈上隐式分配给您的)。

Second, Box其行为与引用不同,因为它是根本不同来自参考文献。另一个名字为Box is 拥有/拥有的指针. Each Box owns它保存的数据,并且它这样做uniquely,因此该数据的可变性继承自盒子本身的可变性。所以是的,这正是如何Box应该管用。

另一种可能更实用的理解方法是考虑Box<T>完全相当于T,除了固定大小和分配方法。换句话说,Box提供值语义:它像任何值一样移动,其可变性取决于它存储的绑定。

有多种方法可以创建指向堆上可变数据的指针,同时保持指针不可变。最通用的是RefCell:

use std::cell::RefCell;

struct X { id: u32 }
let x: Box<RefCell<X>> = Box::new(RefCell::new(X { id: 0 }));
x.borrow_mut().id = 1;

或者,您可以使用Cell (for Copy types):

let x: Box<Cell<u32>> = Box::new(Cell::new(0));
x.set(1);

请注意,上面的示例使用了所谓的“内部可变性”,最好避免这种情况,除非您do需要它来做某事。如果你想创建一个Box使用可变内部只是为了保持可变属性,你真的不应该这样做。它不是惯用的,只会导致语法和语义负担。

您可以在这里找到很多有用的信息:

  • 所有权 http://doc.rust-lang.org/book/ownership.html
  • 参考文献和借用 http://doc.rust-lang.org/book/references-and-borrowing.html
  • 可变性 http://doc.rust-lang.org/book/mutability.html
  • 标准::细胞 http://doc.rust-lang.org/std/cell/- 内部可变类型

事实上,如果您对可变性等基本问题有疑问,书中可能已经对此进行了解释:)

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

参考和盒子之间的可变性差异 的相关文章

  • 派生 Enum 的特征副本时,“未实现特征克隆”

    下面的代码 derive Copy enum MyEnum Test 给我这个错误 错误 特质core clone Clone未针对该类型实现MyEnum E0277 为什么会出现这种情况 我该如何解决 The Copy特质是Clone h
  • 如何“切换”枚举变体?

    我想编写一个函数 将提供的值切换 切换到枚举中的下一个值并在末尾环绕 enum Direction NORTH SOUTH EAST WEST 例如 NORTH gt SOUTH SOUTH gt EAST EAST gt WEST WES
  • 为什么这个 Rust 程序忽略不变性

    我有以下 Rust 程序 我希望它会导致编译错误 因为x稍后会重新分配 但它遵守并给出输出 为什么 fn main let x y 1 3 println X is and Y is x y let x i32 565 println No
  • 函数指针声明语法混乱[重复]

    这个问题在这里已经有答案了 我已经阅读并搜索了有关解码函数指针的右左规则 For ex int fun one char double 9 20 is fun one 是指向函数的指针 需要 char double 和 返回指向 int 数
  • 异步任务中止时会发生什么?

    锈有async可以绑定到的方法Abortable https docs rs futures preview 0 3 0 alpha 19 futures future struct Abortable html期货 文档说 当中止时 未来
  • 如何按元素添加两个 Rust 数组?

    这绝对是一个初学者问题 但我搜索了半个小时后找不到任何有用的东西 我有 Rust 1 7 0 和这段代码 type coord i64 3 add two coordinates vectors pointwise that is if z
  • Visual Studio '17 未在参考管理器中显示程序集

    我遇到的问题是 我似乎无法弄清楚如何添加对某些解决方案的引用 在我从 Visual Studio 17 开始的大多数解决方案中 我在解决方案资源管理器中看到 引用 但例如对于 asp net core web api 我得到 依赖项 每当解
  • 术语“引用”的起源,如“通过引用传递”

    Java C 语言律师喜欢说他们的语言按值传递引用 这意味着 引用 是调用函数时复制的对象指针 同时 在 C 中 以及 Perl 和 PHP 中更动态的形式 引用是其他名称 或动态情况下的运行时值 的别名 我对这里的词源感兴趣 参考 一词的
  • 字符串向量上的连接运算符相当于什么?

    我无法找到向量上 连接 运算符的 Rust 等效项Strings 我有一个Vec
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • Rust 期货中的“then”、“and_then”和“or_else”有什么区别?

    我正在学习使用 Rust future 我发现它非常令人困惑 我觉得我很蠢 但什么时候才能then and then and or else使用 预期返回什么类型 请提供一些您希望看到的不同情况的示例 TL DR then当你想做某事而不管
  • 为二叉树实现 IntoIterator

    我正在尝试构建一棵二叉树并编写一个迭代器来遍历树中的值 当为我的树节点实现 IntoIterator 特征时 我遇到了生命周期问题 src main rs 43 6 43 8 error the lifetime parameter a i
  • VacantEntry 未在名为 set 的范围内实现任何方法

    这段代码 use std collections hash map Entry Occupied Vacant use std collections HashMap fn main let mut vars HashMap
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束
  • 声明 for 循环变量时 &mut 会做什么吗?

    考虑以下 愚蠢的 程序 fn main let mut array mut 1u8 2u8 3u8 for mut value in array 它编译并运行正常 尽管如预期的那样警告未使用的变量 不必要的可变性 但有什么作用 mut做在f
  • 当返回使用 StdinLock 的结果时,为什么保留了对 stdin 的借用?

    给定以下函数 use std io BufRead stdin fn foo gt usize let stdin stdin let stdinlock stdin lock stdinlock lines count 无法编译并出现以下
  • 有关 UnsafeMutablePointer 的 destroy() 的术语

    Destroy the object the pointer points to Precondition the memory is initialized Postcondition the value has been destroy
  • void* 将具有与 char 指针相同的表示形式和内存对齐方式

    我正在读一本关于指针的书 名为 理解和使用c指针 到那个时刻void it says 它有两个有趣的属性 指向 void 的指针将具有与指向 char 的指针相同的表示形式和内存对齐方式 我困惑的是所有指针的内存不都是一样的吗 他们为什么不
  • 带有参考的 Haskell 数据类型

    我正在实现 Ukkonen 的算法 该算法要求树的所有叶子都包含对同一整数的引用 并且我在 Haskell 中执行此操作是为了了解有关该语言的更多信息 但是 我很难编写出执行此操作的数据类型 Node has children indexe
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a

随机推荐

  • JavaScript 数组克隆

    我有这种方法来制作数组 var playerList exports player function socket name this id socket id this name name this x 20 this y 40 retu
  • 单击时功能区按钮不会触发 onAction 设置的事件

    我设计了一个 Outlook 2010 加载项 在其中尝试触发 或者更确切地说 捕获 单击按钮时触发的事件 如图所示在本文中 http social msdn microsoft com Forums en US vsto thread a
  • 回退到 TURN 的连接的预期百分比是多少?

    假设我搭建了WebRTC视频聊天网站 握手后有些连接 ICE Candidates 会直接p2p 有些会使用STUN服务器 有些会使用 最后手段 TURN服务器来建立连接 与直接连接和 STUN 连接 免费 相比 基于 TURN 服务器的连
  • 使用 NIB 文件会导致性能损失吗?

    我很想知道是否有人有经验比较 iPhone 应用程序与 NIB 中布局的视图与完全以编程方式布局的视图 即实例化 UITextView 将其添加到视图 实例化 UIButton 将其添加到视图 的加载时间性能 如果我想要加载一个简单的应用程
  • numpy 有没有办法测试矩阵是否为酉矩阵

    我想知道 numpy 中是否有任何函数可以确定矩阵是否为酉矩阵 这是我写的函数 但它不起作用 如果你们能发现我的函数中的错误和 或告诉我另一种方法来确定给定矩阵是否是单一的 我将不胜感激 def is unitary matrix np n
  • 如何在 C++17 中读取 UTF-16 文本文件

    我对 C 很陌生 我想在 Visual Studio 2019 中读取 C 17 中的 UTF 16 文本文件 我在互联网上尝试了几种方法 包括StackOverflow 但没有一个起作用 并且其中一些无法编译 我认为它们只支持较旧的编译器
  • 如何在 numpy 或 pytorch 中向量化自定义算法?

    假设我有两个矩阵 A size k x m B size m x n 使用自定义操作 我的输出将是k x n 此自定义操作不是行之间的点积A和列B Suppose该自定义操作定义为 对于第 I 行A和第 J 列B the i j输出的元素是
  • 指令解码器如何区分前缀和主操作码?

    我正在尝试了解 x86 指令编码格式 我读过的所有资料仍然让这个主题令人困惑 我开始有点了解它 但我无法理解的一件事是 CPU 指令解码器如何区分操作码前缀和操作码 我知道指令的整个格式基本上取决于操作码 当然还有操作码中定义的额外位字段
  • 在 Folium HeatMapWithTime 中显示日期、id 列和其他列

    我有一个这样的出租车频率数据集 ID Date Latitude Longitude Sample Mean 01 2019 10 09 40 431753 3 711294 0 1 03 2019 10 21 40 431753 3 71
  • 如何使用 HTML5 预加载页面?

    我记得读过有关使浏览器预加载页面的元标记的文章 又是什么标签 预取包含在W3C 规范名为 资源提示 http www w3 org TR resource hints dfn prefetch 它在 Firefox Chrome IE 11
  • pygame.display.init() 对于非 root 用户失败

    Tl dr 我需要使用pygame但由于权限问题 它无法以普通用户身份初始化屏幕帧缓冲驱动程序 根可以做pygame display init 但不是用户 用户位于 视频 组中 可以在其上书写 dev fb0 用户缺少什么权限pygame
  • ionic cordova 运行 ios - 导出失败,代码 65

    我已经完成了对这个错误的研究 尝试运行时出现以下错误ionic cordova run ios livereload cordova Non system Ruby in use This may cause packaging to fa
  • 将超类合并到 Guava Objects.hashcode() 实现中的正确方法?

    可能是个愚蠢的问题 但我不想搞砸 假设我有两个 Java 类 Class1 and Class2 where Class2 extends Class1 我想覆盖Object hashcode 两个类都使用番石榴 对于超类 我有 Overr
  • 保持纵横比的 Div,同时填充其容器,该容器也保持纵横比并填充屏幕

    我正在尝试创建一个设置 其中有一个容器 参见下图 蓝色 该容器保持 16 9 的宽高比 并且始终适合屏幕 始终保持尽可能大的大小 同时完全保留在浏览器窗口中 然后它内部有一个 div 绿色 它也保持 16 9 的长宽比并填充外部容器 我需要
  • Android - 如何以批处理模式接收传感器数据?

    奇巧推出传感器批处理 https source android com devices sensors batching html 但我无法在批处理模式下从传感器读取数据 My code public class MainActivity
  • 在打字稿中找不到名称“省略”

    背景 我正在定制我的index d ts文件于src types index d ts 我需要像下面这样合并我的类型 src types index d ts declare namespace Admin interface Initia
  • 不要在 Rails 生成控制器上创建视图文件夹

    当您运行时 有没有一种方法可以使用常用的生成器配置来关闭视图文件夹和操作模板的创建rails generate controller 我在任何地方都找不到选项和代码here https github com rails rails blob
  • 如何在 R 中使用 system() 或 shell() 执行 git-bash 命令

    我想运行一些命令git bash壳通过system or shell R 中的函数 我在 Windows 上 默认 shell 是命令提示符 有什么办法可以切换 shellsystem to git bash 谢谢 If your PATH
  • 在 C++ 中重塑张量

    TensorFlow 的 C 接口似乎没有 reshape 方法 有谁知道如何转换 例如 A B C D into A B C D 看起来唯一的方法就是使用 Eigen 然而 那里的文档非常薄弱 代码是模板地狱 不容易解析 检查重塑张量是否
  • 参考和盒子之间的可变性差异

    我试图了解 Rust 指针类型及其与可变性的关系 具体来说 声明一个保存指针且本身可变的变量的方法 即可以指向其他内存 并声明该变量数据本身是可变的 即可以改变through指针变量的值 这就是我对简单引用工作方式的理解 let mut a