1. 一个令人困惑的崩溃:为什么“只读”操作会 panic?
想象你正在开发一个基于 Actix Web 的 API 服务,一切正常,直到某天集成测试突然失败:
thread \’test_request_more_trials\’ panicked at …: already borrowed: BorrowMutError
更奇怪的是,出错的代码看起来完全是“只读”的:
pub fn extract_user_id_securely(req: &HttpRequest) -> Result<String, AppError> {
let extensions = req.extensions(); // ← 获取扩展数据
if let Some(user_id) = extensions.get::<String>() {
return Ok(user_id.clone());
}
match req.cookie(\”user_id\”) {
/* … */ } // ← 这里崩溃!
}
明明只是读取 cookie,为什么会触发“已借用”的错误?答案就藏在 Rust 的 RefCell 和 内部可变性(Interior Mutability) 机制中。
2. 回顾基础:Rust 的借用规则为何“太严格”?
Rust 的核心安全保证之一是 借用规则:
- 在同一作用域内,你可以拥有任意数量的不可变引用(&T),或
- 恰好一个可变引用(&mut T)
这确保了数据竞争在编译期就被杜绝。但这也带来一个问题:当数据被多个所有者共享时,如何修改它?
例如,使用 Rc<T>(引用计


