MST

星途 面试题库

面试题:Rust中RefCell借用规则的基础应用

假设有如下Rust代码: ```rust use std::cell::RefCell; fn main() { let cell = RefCell::new(5); let borrow1 = cell.borrow(); // 在此处添加一行代码,尝试获取另一个不可变借用,会发生什么?为什么? // 同时解释如何在不违反借用规则的前提下获取第二个不可变借用 } ```
27.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

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

在这个修改后的代码中,当 borrow1 离开其作用域({} 内)时,其借用被释放,此时获取 borrow2 不会违反 RefCell 的运行时借用规则。