gpt4 book ai didi

linked-list - 不能直接将可变引用传递给自己

转载 作者:行者123 更新时间:2023-11-29 08:30:52 25 4
gpt4 key购买 nike

我目前正在研究链表上的 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

所以我不确定第二个实现有什么问题。

最佳答案

问题在于,旨在直接可变的拥有变量必须可变绑定(bind)。

当你声明一个变量或一个函数参数时,这可以统一为声明一个绑定(bind)值到某个名称 - 使用关键字 let 或用方括号包围参数列表。此绑定(bind)可以是可变的或不可变的,具体取决于是否存在 mut 关键字。

如果您将绑定(bind)声明为不可变的,即省略 mut 关键字,编译器声明您不会获得对它的唯一引用(因此不会改变值,取模任何UnsafeCell 在里面)。因此,如果您试图获取对它的 &mut 引用,这是一个错误。

要修复该错误,您可以可变地重新绑定(bind)变量,有效地丢弃之前的绑定(bind)(如果值不是 Copy),或者首先可变地绑定(bind)它 - 因为这是一个作为绑定(bind)的一部分而不是变量声明的一部分,它可以在函数声明以及 let 语句中使用。

关于linked-list - 不能直接将可变引用传递给自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com