rust - 为什么在 Rust 中通过指针对同一个值的多个可变引用是合法的

标签 rust reference ownership

我正在努力理解 Rust 的所有权和借用模型,但对以下内容感到困惑:

let mut x: i32 = 1;
let ref_x = &mut x;
let refref_x = &mut *ref_x;
*refref_x = 2;
*ref_x = 3;

据我所知,我有效地创建了两个对 x 的独立可变引用。为什么这段代码在避免通过指针间接并将第 3 行更改为

时是合法的
let refref_x = &mut x;

显然不是? 我误解了中心概念还是编译器在后台添加了一些魔法?

最佳答案

To my knowledge, I am effectively creating two separate mutable references to x.

不,第二个引用从第一个引用借用(并因此锁定),您可以查看是否尝试使用第一个引用,而第二个引用仍然存在:

let mut x: i32 = 1;
let ref1 = &mut x;
let ref2 = &mut *ref1;
*ref1 = 3; // <- can not assign because ref1 is borrowed (by the previous line)
*ref2 = 2;

ref2ref1reborrow。毫不奇怪,您会因为 this is an ill-documented feature 而感到困惑。 ,虽然是一个非常重要的。

Am I misunderstanding central concepts or is the compiler adding some magic in the background?

两者兼而有之,基本上 &[mut]* 是该语言的“特殊形式”,它不会取消引用该值然后完全单独重新引用它,而是“重新解释” "指针。

顺便说一句,这可能会在您第一次遇到 forced moves 时导致更加困惑。 .

关于rust - 为什么在 Rust 中通过指针对同一个值的多个可变引用是合法的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69249176/

相关文章:

rust - 如何在 Rust 中对 'Option' 分配进行分组?

rust - 用 Hyper 显示响应体只显示响应体的大小

rust - 特质 `std::convert::From<cli::Opts>`未实现

rust - 如何在Rust中返回链式迭代器

c# - Google Drive SDK 为用户创建文件

rust - 将向量传递给函数的替代方法?

c++ - 引用右值

swift - 如何从另一个类的确切实例引用属性?

java - 如何在一个方法中使用另一个方法?

rust - 从 HashSet 中删除任何元素并获得所有权(随机顺序很好)