引用不仅传输数据还传输变量类型

问题描述 投票:0回答:1

我真的很抱歉我的提问方式是否让你这个刚接触 Rust 的人感到困惑

let p = vec![23, 3, 31, 4];
let mut p1 = p;
p1.push(10);

let p2 = &mut p1;
p2.push(11);

上面的代码所有权从 p 转移到 p1,并且将值推送到 vec p1 应该是一个 mut 变量,但是当 p1 是 mut 引用 p2 时,p2 不需要声明为 mut 并且 p2 上的推送仍然有效。

我的疑问来自于当 p 所有权被移动时,只有 p 在堆上保存的数据现在指向 p1 的堆栈,并且 p 无效 -> 在这种情况下,只有数据被移动,而不是 p 作为不可变向量的属性没有像 p1 那样移动,它是可变属性(mut)

同样,当 p2 被 mut 引用 p1 时,并且没有明确提及它在变量方面与 p2 一样,p2 能够编辑,因为它借用了可变引用

在 p1 = p 中,p1 需要明确提及为 mut ,因为 p 是 immut

那么同样 p2 也必须被称为 mut ?

rust rust-cargo
1个回答
0
投票

我正在回答我自己的问题

所有权转移创建一个新的绑定,新的所有者需要声明它将如何处理数据(可变或不可变)。

借用不会创建新的绑定。相反,它暂时分享现有的所有权。借用的可变性完全取决于借用的类型(& 或 &mut)。

所以很简单,就好像所有权被转移一样,新所有者可以决定它是可变的还是不可变的,因为他是所有者

借用时,借用者只能做所有者授予的许可,因为他不是所有者,所以他/她没有权利,就这么简单:)

在下面的代码中,甚至 p1 明确声明它是 mut 但它给出了错误,因为它只是被引用。

let p = vec![23, 3, 31, 4];
let mut p1 = &p;
 p1.push(10); 
// cannot borrow `*p1` as mutable, as it is behind a `&` reference `p1` is a `&` reference, so the data it refers to cannot be borrowed as mutable
© www.soinside.com 2019 - 2024. All rights reserved.