我真的很抱歉我的提问方式是否让你这个刚接触 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 ?
我正在回答我自己的问题
所有权转移创建一个新的绑定,新的所有者需要声明它将如何处理数据(可变或不可变)。
借用不会创建新的绑定。相反,它暂时分享现有的所有权。借用的可变性完全取决于借用的类型(& 或 &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