不能一次多次借用可变的/不能推断出适当的寿命参数

时间:2016-03-16 01:10:19

标签: rust lifetime

在Rust看到this postthis 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"))
        }
    }
}

Playpen Link

编译器抱怨

  

不能一次多次借用* parent作为可变对象

在读取parent.rebind_var(var)的行上,我认为这是由于方法定义中'a上的self生命周期注释,导致parent被借用整个方法的长度。但是,如果我删除'a,则编译器无法在self.scopes绑定的行上推断parent的适当生存期。根据这些信息,我不明白

  1. 如何使parent不受self
  2. 生命周期的约束
  3. 仍然可以绑定parent,使其生命周期正确。

0 个答案:

没有答案