Rust链表append方法实现失败:不可变性与类型不匹配问题
Rust链表append操作的编译错误解析与修复
疑问1:为什么错误信息中显示**n?
你的代码里n的类型确实是&Box<List<T>>,但调用n.append(t)时,Rust会自动完成两次隐式解引用:
- 第一次解引用去掉外层的
&,得到Box<List<T>>; - 第二次是因为
Box<T>实现了Dereftrait,会自动被解引用为内部的List<T>实例。
append方法需要接收&mut self,也就是对List<T>的可变引用,但n是不可变引用,所以编译器会报错说无法对**n(最终的List<T>实例)进行可变借用。
疑问2:如何修正代码?
问题出在你用了as_ref()获取不可变引用,要修改链表节点必须使用as_mut()获取可变引用。修正后的代码如下:
struct List<T> { val: T, next: Option<Box<List<T>>> } impl<T> List<T> { pub fn append(&mut self, t: T) { match self.next.as_mut() { Some(n) => n.append(t), None => { let end = List { val: t, next: None }; self.next = Some(Box::new(end)); } } } }
你之前尝试的Some(&mut n)或Some(mut n)会类型不匹配,是因为as_mut()返回的是Option<&mut Box<List<T>>>,匹配模式里的Some(n)直接绑定的就是&mut Box<List<T>>——可变的语义已经包含在引用类型里了,不需要额外添加&mut或mut修饰。
内容的提问来源于stack exchange,提问作者CryForGG
相关产品推荐
相关产品推荐

