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

why are multiple mutable references to the same value through pointers legal in Rust

我正在研究我对 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;

ref2ref1再借。尽管 this is an ill-documented feature 非常重要,但您会感到困惑也就不足为奇了。

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

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

顺便说一句,这可能会在您第一次遇到 .

时导致更多的困惑