`if`条件仍在借用

时间:2016-11-08 09:13:36

标签: rust

我刚刚遇到Rust的一些行为(1.12)我无法解释。我有一个使用RefCell<Option<i32>>实现延迟加载的结构和一个访问数据的函数:

struct Foo {
    data: RefCell<Option<i32>>
}

impl Foo {
    fn get_data(&self) -> i32 {
        if self.data.borrow().is_none() { // <--- (a)
            let d = 1337;
            self.data.borrow_mut() = Some(d); // <--- (b)
            d
        } else {
            self.data.borrow().unwrap()
        }
    }
}

这会编译但会产生运行时错误:RefCell抱怨在尝试(b)borrow_mut借用已经有效。但是,如果我将if语句更改为以下内容,则不会发生此问题:

let is_none = self.data.borrow().is_none();
if is_none {

问题:为什么在if语句的正文中(a)的if条件中的借位仍然有效?不应该调用is_none()导致借款结束,因为我之后只持有bool而不是借来的价值?

1 个答案:

答案 0 :(得分:5)

这是由于Rust的词汇借用范围。

正如你所注意到的那样,在这种情况下借用一些东西也会为分支借用它。这在this issue中进行了讨论,之后又移动了here

这是目前在Rust 1.13 Beta中修复的限制因此可能会在下一个周期中发布。