如何为Rust的Cons列表实现pop方法,弹出首元素同时修改原列表
问题说明
你代码的核心问题是无法直接从可变引用&mut self中直接搬走内部值,也不能在持有self借用的同时修改self,需要借助标准库工具完成值的安全替换。
正确可运行实现
use crate::List::{Cons, Nil}; fn main() { let mut list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil)))))); println!("The first value is: {}.", list.pop().unwrap()); println!("The second value is: {}.", list.pop().unwrap()); } #[derive(Debug)] enum List { Cons(i32, Box<List>), Nil, } impl List { fn pop(&mut self) -> Option<i32> { // 用Nil作为占位值替换self原有内容,拿到旧列表的所有权 match std::mem::replace(self, Nil) { Cons(value, next) => { // 将self更新为剩余的列表节点 *self = *next; Some(value) } Nil => None } } }
实现逻辑说明
std::mem::replace接收可变引用和新值,会把可变引用指向的内容替换为新值,同时返回旧值的所有权,全程不会出现内存不安全状态。- 你原有写法的问题在于对
&self做不可变借用匹配,既不能修改self,也拿不到内部value和下一级列表的所有权,自然无法完成替换操作。 - 该实现完全符合你的需求:不会消耗原列表,仅原地修改列表内容,调用完pop后原列表可以继续正常使用。
内容的提问来源于stack exchange,提问作者Virgileo
相关产品推荐
相关产品推荐

