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

Rust如何创建含引用的元组Vec 解决临时值释放与借用生命周期错误

错误根因

你遇到的报错本质是被引用对象的生命周期短于引用本身的生命周期,具体包含两个问题:

  • 你直接对临时构造的FeelValue::Name(...)取引用,这个临时值在当前语句执行结束后就会被销毁,存入Vec的引用直接变成悬垂指针
  • 循环内定义的loop_expr是每次迭代的局部变量,迭代结束后就会被释放,存入Vec的可变引用同样会悬垂

解决方案

你需要将所有被引用的对象的所有权持有到for_loops方法调用完成之后,不能让它们在循环迭代结束时就被销毁。只需要在外层新增两个Vec存储实例所有权,再基于所有权实例构造引用集合即可:

修改后代码

fn walk_for_expression(&mut self, in_expressions: &Pair<'a, Rule>, inner_expression: &Pair<'a, Rule>, expr: &mut CompiledExpression) -> Result<(), String> {
    let mut inner_expr = CompiledExpression::new("inner");
    let r1 = self.walk_tree(inner_expression, &mut inner_expr);
    if let Err(message) = r1 {
        return Err(format!("Unable to parse body of for-expression {}. {}", inner_expression.as_str(), message));
    }

    let mut in_expr_children = self.children(in_expressions);

    // 新增两个Vec持有实例所有权,生命周期和当前函数一致
    let mut loop_vars = Vec::new();
    let mut loop_exprs = Vec::new();

    for in_expr in &in_expr_children {
        let mut in_expr_parts = self.children(in_expr);
        let mut loop_expr = CompiledExpression::new("loop-expression");
        let r2 = self.walk_tree(&in_expr_parts[2], &mut loop_expr);

        if let Err(message) = r2 {
            return Err(format!("Unable to parse for-expression's loop expression {}. {}", in_expr_parts[2].as_str(), message));
        }
        // 先把实例存入所有权Vec
        loop_vars.push(FeelValue::Name(QName::from_str(in_expr_parts[0].as_str()).unwrap()));
        loop_exprs.push(loop_expr);
    }

    // 循环结束后再构造引用集合,此时所有实例都已存入所有权Vec,生命周期足够长
    let mut loop_vars_with_expressions: Vec<(&FeelValue, &mut CompiledExpression)> = loop_vars
        .iter()
        .zip(loop_exprs.iter_mut())
        .collect();

    let mut for_expr = CompiledExpression::for_loops(&mut loop_vars_with_expressions, &mut inner_expr);
    expr.append(&mut for_expr);
    Ok(())
}

说明

  • 所有权集合loop_vars和loop_exprs的生命周期覆盖了整个函数执行周期,直到for_loops调用完成后才会被销毁,不会出现引用悬垂的问题
  • 先填充所有权集合、再批量生成引用的写法,也避免了Vec扩容导致旧引用失效的问题,完全符合Rust的生命周期规则

内容的提问来源于stack exchange,提问作者Paul Chernoch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:24:01