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

Rust结构体持有同类型可变引用的生命周期与编译问题咨询

Rust 环境结构体的可变引用生命周期问题

我定义了一个名为Env的结构体,其中outer字段希望持有另一个同类型结构体的可变引用。我需要向编译器说明,该outer字段的生命周期至少与当前实例一样长。

以下是简化后的问题代码(目前无法编译):

use std::collections::HashMap;

#[derive(Debug)]
struct Env<'a> {
    symbols: HashMap<String, i64>,
    outer: Option<&'a mut Env<'a>>
}

impl<'a> Env<'a> {
    fn new() -> Self {
        Env {
            symbols: HashMap::new(),
            outer: None,
        }
    }

    fn new_enclosed(outer: &'a mut Env<'a>) -> Self {
        Env {
            symbols: HashMap::new(),
            outer: Some(outer),
        }
    }

    fn resolve(&self, name: &str) -> i64 {
        if self.symbols.contains_key(name) {
            return *self.symbols.get(name).unwrap();
        }

        if let Some(outer) = &self.outer {
            return outer.resolve(name);
        }

        return 0;
    }

    fn insert(&mut self, name: &str, value: i64) {
        self.symbols.insert(name.to_owned(), value);
    }

    fn update(&mut self, name: &str, value: i64) {
        if self.symbols.contains_key(name) {
            self.symbols.insert(name.to_owned(), value);
        } else {
            if let Some(outer) = &mut self.outer {
                return outer.update(name, value);
            }
        }
    }
}


fn main() {
    // outer env
    let mut env = Env::new(); 
    env.insert("foo", 0);
    env.insert("bar", 0);

    one(&mut env);

    assert_eq!(env.resolve("foo"), 0); // <-- 无法多次可变借用
    assert_eq!(env.resolve("bar"), 2); // <-- 无法多次可变借用
}

fn one<'a>(outer: &'a mut Env<'a>) {
    let mut env = Env::new_enclosed(outer);
    env.insert("foo", 1);
    env.update("bar", 1);

    for i in 1..3 {
        two(&mut env); // <-- 无法多次可变借用
    }
}


fn two<'b>(outer: &'b mut Env<'b>) {
    let mut env = Env::new_enclosed(outer);
    env.insert("foo", 2);
    env.update("bar", 2);
}

理论上,这种结构应该可以不用将Env包裹在Rc<RefCell<...>>中实现,对吗?我猜测是示例中one和two函数的生命周期参数设置有误,但始终无法解决问题。恳请各位提供相关建议(双关语:指针建议)。

编辑1

现在我认为这种设置如果不用RefCell可能无法实现,因为我在循环中传递可变引用,这似乎是不可能的(对吗?)。因此可能需要采用完全不同的结构,我很想了解其他人的想法。另外,我是否应该不用惧怕使用RefCell?

例如,仅使用RefCell来借用不可变引用时,会有运行时开销吗?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:45:32