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
相关产品推荐
相关产品推荐

