不能直接将可变引用传递给自己
Cannot pass mutable reference to self directly
我目前正在研究链表上的 Rust 实现。首先,我阅读了 Learning Rust With Entirely Too Many Linked Lists 上的 Rust 文档。但是我仍然在努力理解我在实现 into()
特性时遇到的错误。
以下是我的实现方式(现在似乎可以正常工作):
impl<T> Into<Vec<T>> for SimpleLinkedList<T> {
fn into(self) -> Vec<T> {
let mut res = Vec::new();
let mut mutable_to_self = self;
fn into_rec<T>(list: &mut SimpleLinkedList<T>, v: &mut Vec<T>) {
if let Some(x) = list.pop() {
into_rec(list, v);
v.push(x);
}
}
into_rec(&mut mutable_to_self, &mut res);
res
令我困惑的是 mutable_to_self
的必要性。
起初,我试图摆脱这个变量,直接将 &mut self
传递给 into_rec()
(对我来说,这完全一样)。但是,当我这样做时,我得到:
error[E0596]: cannot borrow `self` as mutable, as it is not declared as mutable
--> src/lib.rs:93:18
|
82 | fn into(self) -> Vec<T> {
| ---- help: consider changing this to be mutable: `mut self`
...
93 | into_rec(&mut self, &mut res);
| ^^^^^^^^^ cannot borrow as mutable
error: aborting due to previous error
For more information about this error, try `rustc --explain E0596`.
error[E0596]: cannot borrow `self` as mutable, as it is not declared as mutable
--> src/lib.rs:93:18
|
82 | fn into(self) -> Vec<T> {
| ---- help: consider changing this to be mutable: `mut self`
...
93 | into_rec(&mut self, &mut res);
| ^^^^^^^^^ cannot borrow as mutable
所以我不确定第二个实现有什么问题。
问题是要直接可变的拥有变量必须可变绑定。
当您声明一个变量或函数参数时,这可以统一为声明一个 binding 值到某个名称 - 使用关键字 let
或使用括号周围的参数列表。此绑定可以是可变的或不可变的,具体取决于 mut
关键字的存在与否。
如果您将绑定声明为不可变的,即省略 mut
关键字,编译器会声明您不会获取对它的唯一引用(因此不会改变值,取模任何 UnsafeCell
s 在里面)。因此,如果您试图获取对它的 &mut
引用,这是一个错误。
要修复错误,您可以可变地重新绑定变量,有效地丢弃以前的绑定(如果值不是 Copy
),或者首先可变地绑定它 - 因为这是一部分绑定而不是变量声明,它可以在函数声明中使用,也可以在 let
语句中使用。
我目前正在研究链表上的 Rust 实现。首先,我阅读了 Learning Rust With Entirely Too Many Linked Lists 上的 Rust 文档。但是我仍然在努力理解我在实现 into()
特性时遇到的错误。
以下是我的实现方式(现在似乎可以正常工作):
impl<T> Into<Vec<T>> for SimpleLinkedList<T> {
fn into(self) -> Vec<T> {
let mut res = Vec::new();
let mut mutable_to_self = self;
fn into_rec<T>(list: &mut SimpleLinkedList<T>, v: &mut Vec<T>) {
if let Some(x) = list.pop() {
into_rec(list, v);
v.push(x);
}
}
into_rec(&mut mutable_to_self, &mut res);
res
令我困惑的是 mutable_to_self
的必要性。
起初,我试图摆脱这个变量,直接将 &mut self
传递给 into_rec()
(对我来说,这完全一样)。但是,当我这样做时,我得到:
error[E0596]: cannot borrow `self` as mutable, as it is not declared as mutable
--> src/lib.rs:93:18
|
82 | fn into(self) -> Vec<T> {
| ---- help: consider changing this to be mutable: `mut self`
...
93 | into_rec(&mut self, &mut res);
| ^^^^^^^^^ cannot borrow as mutable
error: aborting due to previous error
For more information about this error, try `rustc --explain E0596`.
error[E0596]: cannot borrow `self` as mutable, as it is not declared as mutable
--> src/lib.rs:93:18
|
82 | fn into(self) -> Vec<T> {
| ---- help: consider changing this to be mutable: `mut self`
...
93 | into_rec(&mut self, &mut res);
| ^^^^^^^^^ cannot borrow as mutable
所以我不确定第二个实现有什么问题。
问题是要直接可变的拥有变量必须可变绑定。
当您声明一个变量或函数参数时,这可以统一为声明一个 binding 值到某个名称 - 使用关键字 let
或使用括号周围的参数列表。此绑定可以是可变的或不可变的,具体取决于 mut
关键字的存在与否。
如果您将绑定声明为不可变的,即省略 mut
关键字,编译器会声明您不会获取对它的唯一引用(因此不会改变值,取模任何 UnsafeCell
s 在里面)。因此,如果您试图获取对它的 &mut
引用,这是一个错误。
要修复错误,您可以可变地重新绑定变量,有效地丢弃以前的绑定(如果值不是 Copy
),或者首先可变地绑定它 - 因为这是一部分绑定而不是变量声明,它可以在函数声明中使用,也可以在 let
语句中使用。