rust 由于不可变性和类型不匹配,写链表失败

0lvr5msh  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(112)

我在Rust中用append操作实现链表时遇到了麻烦,我选择了struct来实现它,为了简单起见,我省略了头指针。

struct List<T> {
    val: T,
    next: Option<Box<List<T>>>
}

目前我已经尝试过像这样实现append函数,它不能编译:

pub fn append(&mut self, t: T) {
    match self.next.as_ref() {
        Some(n) => n.append(t),
        // compile error here
        None => {
            let end = List {val: t, next: None};
            self.next = Some(Box::new(end));
        }
    }
}

错误消息如下:

cannot borrow `**n` as mutable, as it is behind a `&` reference

为什么n在这里是**nn&Box<List<T>>类型,我应该如何理解这里的双重解引用符号**
我知道我需要一个对智能指针的可变引用,但是将该行更改为

Some(&mut n) => n.append(t),

Some(mut n) => n.append(t),

没有解决这个问题,因为编译器会抱怨类型不匹配。我应该做些什么来改进它呢?

jqjz2hbq

jqjz2hbq1#

您需要as_mut()而不是as_ref()。根据the docsas_ref()
&Option<T>转换为Option<&T>
其中Option内部的引用是不可变的,但as_mut()
&mut Option<T>转换为Option<&mut T>

相关问题