如何实现不转移所有权的Rust函数,递归获取Vec的n层末尾可修改子元素
Rust 实现方案
核心思路
- 函数参数接收
&mut Vec<Node>可变引用,不转移原Vec的所有权,调用结束后原变量仍可正常使用 - 全程使用可变引用遍历层级,保证返回的节点引用支持后续修改操作
- 循环更新当前遍历的Vec引用,逐层深入到第n级的children列表,最终返回目标节点的可变引用
自定义结构体定义
首先定义包含children属性的自定义结构体:
#[derive(Debug, Default)] struct Node { // 可根据需求添加其他自定义字段 children: Vec<Node>, }
功能实现代码
/// 深入n层,返回对应层级的最后一个子节点的可变引用 /// 入参n:需要向下深入的层级数,n=0时直接返回当前Vec的最后一个元素 fn get_nth_level_last_child(vec: &mut Vec<Node>, n: usize) -> &mut Node { let mut current_vec = vec; for _ in 0..n { // 取当前Vec最后一个元素的可变引用,再拿到其children的可变引用作为下一轮遍历对象 current_vec = &mut current_vec.last_mut().unwrap().children; } // 返回最终层级的最后一个节点的可变引用 current_vec.last_mut().unwrap() }
使用示例
fn main() { // 初始化测试用的嵌套Vec结构 let mut root_vec = vec![Node { children: vec![Node { children: vec![Node::default()], }], }]; // 深入1层,拿到第一层节点的children的最后一个节点(即第二层节点) let target_node = get_nth_level_last_child(&mut root_vec, 1); // 直接修改返回的节点,向其children中插入新元素 target_node.children.push(Node::default()); // 原root_vec所有权未被转移,可正常使用 println!("{:?}", root_vec); }
错误安全优化
上面的实现用了unwrap,如果某一层的Vec为空会触发panic,可优化为返回Option处理空列表场景:
fn get_nth_level_last_child_safe(vec: &mut Vec<Node>, n: usize) -> Option<&mut Node> { let mut current_vec = vec; for _ in 0..n { current_vec = current_vec.last_mut()?.children.as_mut(); } current_vec.last_mut() }
内容的提问来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

