我创建了两个示例代码,一个使用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()
不是。它返回一个实现Drop
的RefMut
——因为它需要在丢弃RefCell
后将其标记为不再借用。因此,编译器可以延长&mut n
的生命周期,因为它在删除时不做任何事情,但它不能为nn.borrow_mut()
这样做,因为它改变了程序的行为。