You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现不转移所有权的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 22:39:03