面试题答案
一键面试BorrowMutError
- 错误产生原因:当一个值已经被不可变借用(
borrow
)时,尝试对其进行可变借用(borrow_mut
)会导致这个错误。因为Rust的借用规则规定,在同一时间内,要么只能有多个不可变借用,要么只能有一个可变借用。 - 代码示例:
- 错误产生原因:当一个值已经被不可变借用(
use std::cell::RefCell;
fn main() {
let cell = RefCell::new(5);
{
let _borrow = cell.borrow();
// 这里尝试可变借用会失败
let _borrow_mut = cell.borrow_mut();
}
}
运行这段代码会得到类似于 thread 'main' panicked at 'already borrowed: BorrowMutError'
的错误。
BorrowError
- 错误产生原因:当一个值已经被可变借用(
borrow_mut
)时,尝试对其进行不可变借用(borrow
)会导致这个错误。同样是因为Rust的借用规则,同一时间不能既有可变借用又有不可变借用。 - 代码示例:
- 错误产生原因:当一个值已经被可变借用(
use std::cell::RefCell;
fn main() {
let cell = RefCell::new(5);
{
let _borrow_mut = cell.borrow_mut();
// 这里尝试不可变借用会失败
let _borrow = cell.borrow();
}
}
运行这段代码会得到类似于 thread 'main' panicked at 'already borrowed: BorrowError'
的错误。
DoubleRefError
- 错误产生原因:当通过
RefCell::try_borrow
或RefCell::try_borrow_mut
多次借用同一个RefCell
,且之前的借用还未释放时,会导致这个错误。try_borrow
和try_borrow_mut
不会像borrow
和borrow_mut
那样在借用冲突时直接panic
,而是返回Result
,但如果违反借用规则,结果会是Err(DoubleRefError)
。 - 代码示例:
- 错误产生原因:当通过
use std::cell::RefCell;
fn main() {
let cell = RefCell::new(5);
let result1 = cell.try_borrow();
let result2 = cell.try_borrow();
if let Err(_) = result2 {
println!("DoubleRefError occurred");
}
}
在这个示例中,第二次 try_borrow
会返回 Err(DoubleRefError)
,因为第一次借用还未结束。