这个问题在这里已有答案:
我刚刚遇到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
抱怨在尝试 borrow_mut
行 (b) 时借用已经处于活动状态 . 但是,如果我将if语句更改为以下内容,则不会发生此问题:
let is_none = self.data.borrow().is_none();
if is_none {
Question: 为什么第 (a) 行的if条件中的借位在if语句的主体内仍然有效?不应该拨打 is_none()
导致借款结束,因为我之后只持有 bool
而不是借来的 Value ?
1 回答
这是由于Rust的词汇借用范围 .
正如你所注意到的那样,在这种情况下借用一些东西也会为分支借用它 . 这在this issue中进行了讨论,之后又移动了here .
这是目前在Rust 1.13 Beta中修复的限制,因此可能会在下一个周期中发布 .