如何对静态HashMap中的值返回多个可变引用?

时间:2017-05-18 10:01:24

标签: rust

我正在实现一个汇编程序,它应该为多个代码段(控制部分)维护一个符号表。我正在使用一个全局静态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,因为程序中没有线程,只有测试线程。

我也想避免使用不安全的代码,因为我可能无法理解它。

0 个答案:

没有答案