RefCell的借用值存在的时间不够长



我创建了两个示例代码,一个使用Box的引用,另一个使用RefCell的borrow_mut,它们不一样,令我惊讶。

use std::cell::RefCell;
#[derive(Debug)]
struct A {
a: usize,
}
fn main() {
let m;
let mut n = Box::new(A{a:5});
{let a = &mut n; m = &mut a.a;}
*m = 6;
println!("{}", m);
println!("{:?}", n);
let mm;
let mut nn = RefCell::new(A{a:5});
{let mut aa = nn.borrow_mut(); mm = &mut aa.a;}
*mm = 6;
println!("{:?}", mm);
println!("{:?}", nn);
}

我得到一个错误,说aa借来的值没有活得足够长。和傻瓜aa。a应该是&必须使用,所以与RefCell无关,应该像Box示例一样工作。为什么会出现这个错误?

问题是,虽然借用&mut n只是一个纯引用,nn.borrow_mut()不是。它返回一个实现DropRefMut——因为它需要在丢弃RefCell后将其标记为不再借用。因此,编译器可以延长&mut n的生命周期,因为它在删除时不做任何事情,但它不能为nn.borrow_mut()这样做,因为它改变了程序的行为。

最新更新