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

s1g*_*egv 3 reference ownership rust

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

let mut x: i32 = 1;
let ref_x = &mut x;
let refref_x = &mut *ref_x;
*refref_x = 2;
*ref_x = 3;
Run Code Online (Sandbox Code Playgroud)

据我所知,我实际上正在创建两个单独的可变引用x。为什么这段代码在避免通过指针间接寻址并仅将第 3 行更改为

let refref_x = &mut x;
Run Code Online (Sandbox Code Playgroud)

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

Mas*_*inn 7

据我所知,我实际上正在创建两个单独的对 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;
Run Code Online (Sandbox Code Playgroud)

ref2是 的重ref1。你会感到困惑,这并不奇怪,因为这是一个没有详细记录的功能,尽管这是一个非常重要的功能。

我是否误解了中心概念,或者编译器是否在后台添加了一些魔法?

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

顺便说一句,这可能会在你第一次遇到强制动作时导致更加混乱。