我在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在这里是**n
?n
有&Box<List<T>>
类型,我应该如何理解这里的双重解引用符号**
?
我知道我需要一个对智能指针的可变引用,但是将该行更改为
Some(&mut n) => n.append(t),
或
Some(mut n) => n.append(t),
没有解决这个问题,因为编译器会抱怨类型不匹配。我应该做些什么来改进它呢?
1条答案
按热度按时间jqjz2hbq1#
您需要
as_mut()
而不是as_ref()
。根据the docs,as_ref()
从
&Option<T>
转换为Option<&T>
其中Option内部的引用是不可变的,但
as_mut()
从
&mut Option<T>
转换为Option<&mut T>