当前位置: 首页 > 知识库问答 >
问题:

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

呼延才
2023-03-14

我正在努力理解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;

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

共有1个答案

华欣怡
2023-03-14

据我所知,我正在有效地创建两个单独的 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;

< code>ref2是< code>ref1的重新箭头。这并不奇怪你会感到困惑,因为这是一个没有被很好地记录的特性,尽管是一个非常重要的特性。

是我误解了中心概念,还是编译器在后台添加了一些魔力?

两者兼而有之,基本上

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

 类似资料:
  • 我在Rust中尝试函数指针魔术,最后得到了一个代码片段,我完全无法解释它为什么要编译,甚至无法解释它为什么要运行。 我无法解释为什么调用的方法是在

  • 本文向大家介绍为什么我们在C ++中通过引用传递指针?,包括了为什么我们在C ++中通过引用传递指针?的使用技巧和注意事项,需要的朋友参考一下 如果需要修改指针而不是指针指向的对象,则可以按引用传递指针。 这是如何通过引用传递指针的示例- 示例 输出结果

  • 本文向大家介绍一个指针可以是volatile 吗?解释为什么。 相关面试题,主要包含被问及一个指针可以是volatile 吗?解释为什么。 时的应答技巧和注意事项,需要的朋友参考一下 • 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。  

  • 我有一个值,我想以我自己的类型存储该值和对该值中某些内容的引用: 有时,我有一个值,我想将该值和对该值的引用存储在同一个结构中: 有时,我甚至没有引用该值,我得到了相同的错误: 在每种情况下,我都会得到一个错误,即其中一个值“活得不够长”。这个错误是什么意思?

  • 本文向大家介绍什么是指向指针的指针? 相关面试题,主要包含被问及什么是指向指针的指针? 时的应答技巧和注意事项,需要的朋友参考一下 指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址. 此时指针指向的变量长度也是4位.