为什么在 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;
ref2
是ref1
的再借。尽管 this is an ill-documented feature 非常重要,但您会感到困惑也就不足为奇了。
Am I misunderstanding central concepts or is the compiler adding some magic in the background?
两者兼而有之,基本上 &[mut]*
是语言的一种“特殊形式”,它不会取消引用该值然后完全单独地重新引用它,而是“重新解释”指针。
顺便说一句,这可能会在您第一次遇到 .
时导致更多的困惑
我正在研究我对 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;
ref2
是ref1
的再借。尽管 this is an ill-documented feature 非常重要,但您会感到困惑也就不足为奇了。
Am I misunderstanding central concepts or is the compiler adding some magic in the background?
两者兼而有之,基本上 &[mut]*
是语言的一种“特殊形式”,它不会取消引用该值然后完全单独地重新引用它,而是“重新解释”指针。
顺便说一句,这可能会在您第一次遇到