我正在实现一个汇编程序,它应该为多个代码段(控制部分)维护一个符号表。我正在使用一个全局静态HashMap
,其中包含每个控制部分的HashMap
,因此层次结构就像这样
HashMap<String, HashMap<ContSectSymTab>>
{ "Sect0" : ConSectSymtab }
{ "Sect1" : ConSectSymtab }
当我使用它作为静态对象时,我正在使用lazy_static!
宏
如下
lazy_static!{
static ref MASTER_TABLE:RwLock<HashMap<String,CsectSymTab>> =
RwLock::new(HashMap::new());
}
我正在尝试创建一个函数,它返回对内部ConsSectSymtab
对象的可变引用,并在搜索了一段时间后达到了以下
fn access_csect_table_for_insert<'a>(csect: &str) -> Result<RefCell<&'a CsectSymTab>, String> {
let guard = MASTER_TABLE.write();
let mut master_table: &'a mut HashMap<String, CsectSymTab> = &mut (*guard);
let csect_table = master_table.get_mut(csect).unwrap();
Ok(RefCell::new(csect_table))
}
编译器抱怨master_table
的生命周期,但我只需要csect_table
对象。
编译器似乎担心在csect_table
的引用超出范围后使用master_table
。但这正是我想要做的,只是改变csect_table
的内容而不用担心master_table
完整错误:
error: `guard` does not live long enough
--> src/lib/basic_types/symbol_tables.rs:129:73
|
129 | let mut master_table: &'a mut HashMap<String, CsectSymTab> = &mut (*guard);
| ^^^^^ does not live long enough
...
132 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the body at 127:94...
--> src/lib/basic_types/symbol_tables.rs:127:95
|
127 | fn access_csect_table_for_insert<'a>(csect: &str) -> Result<RefCell<&'a CsectSymTab>, String> {
| _______________________________________________________________________________________________^ starting here...
128 | | let guard = MASTER_TABLE.write();
129 | | let mut master_table: &'a mut HashMap<String, CsectSymTab> = &mut (*guard);
130 | | let csect_table = master_table.get_mut(csect).unwrap();
131 | | Ok(RefCell::new(csect_table))
132 | | }
| |_^ ...ending here
我并不关心RwLock
,因为程序中没有线程,只有测试线程。
我也想避免使用不安全的代码,因为我可能无法理解它。