在Rust看到this post,this post以及其他几个类似的问题后,我在Rust中遇到了一个特定的生命周期问题。特别是,我有这些结构和&相关实施:
use std::collections::hash_map::HashMap;
use std::mem;
pub struct JsVar {
binding: String,
}
pub struct Scope<'a> {
pub vars: Vec<JsVar>,
locals: HashMap<String, &'a JsVar>,
}
impl<'a> Scope<'a> {
pub fn new() -> Scope<'a> {
Scope {
vars: Vec::new(),
locals: HashMap::new(),
}
}
pub fn rebind_var(&'a mut self, var: JsVar) {
self.vars.push(var);
let var_ref: &'a JsVar = match self.vars.last() {
Some(var) => var,
None => unreachable!(),
};
self.locals.insert(var_ref.binding.clone(), var_ref);
}
}
pub struct ScopeManager<'a> {
scopes: Vec<Scope<'a>>,
}
impl<'a> ScopeManager<'a> {
pub fn pop_scope(&'a mut self, gc_yield: bool) -> Result<(), String> {
if let Some(mut scope) = self.scopes.pop() {
// Actual code snipped for brevity; this is the relevant operation.
let mut vars = mem::replace(&mut scope.vars, Vec::new());
let mut parent: &mut Scope<'a> = self.scopes.last_mut().unwrap();
while let Some(var) = vars.pop() {
parent.rebind_var(var);
}
Ok(())
} else {
Err(String::from("Bad Scope"))
}
}
}
编译器抱怨
不能一次多次借用* parent作为可变对象
在读取parent.rebind_var(var)
的行上,我认为这是由于方法定义中'a
上的self
生命周期注释,导致parent
被借用整个方法的长度。但是,如果我删除'a
,则编译器无法在self.scopes
绑定的行上推断parent
的适当生存期。根据这些信息,我不明白
parent
不受self
和parent
,使其生命周期正确。