面试题答案
一键面试- 添加代码及结果:
- 如果在此处添加
let borrow2 = cell.borrow();
,代码会在运行时 panic。因为RefCell
在运行时检查借用规则,虽然 Rust 的不可变借用通常允许多个同时存在,但RefCell
内部通过引用计数和内部可变性机制来管理借用。当borrow1
存在时,再尝试获取borrow2
,RefCell
运行时检测到违反借用规则(不能同时有多个可变借用或可变借用与不可变借用共存),就会 panic。
- 如果在此处添加
- 不违反借用规则获取第二个不可变借用的方法:
- 可以通过在获取第二个借用前,先释放第一个借用。例如:
use std::cell::RefCell;
fn main() {
let cell = RefCell::new(5);
{
let borrow1 = cell.borrow();
// 第一个借用的作用域
}
let borrow2 = cell.borrow();
// 第二个借用现在是安全的
}
在这个修改后的代码中,当 borrow1
离开其作用域({}
内)时,其借用被释放,此时获取 borrow2
不会违反 RefCell
的运行时借用规则。