面试题答案
一键面试触发多重借用限制的场景
假设有如下Rust代码:
fn main() {
let mut s = String::from("hello");
let r1 = &s;
let r2 = &s;
s.push_str(", world");
println!("{}, {}", r1, r2);
}
触发原因
- 规则概述:在Rust中,对于可变引用(
&mut
),同一时间只能有一个可变引用存在,以保证数据的一致性。对于不可变引用(&
),同一时间可以有多个不可变引用存在,但前提是不存在可变引用。 - 具体分析:上述代码中,
let r1 = &s;
和let r2 = &s;
创建了两个不可变引用r1
和r2
。之后s.push_str(", world");
尝试对s
进行修改,这需要一个可变引用。此时,因为已经存在不可变引用r1
和r2
,违反了Rust的借用规则,所以会触发多重借用限制错误。在Rust看来,同时存在不可变引用和对同一数据的修改操作可能会导致数据竞争和未定义行为,所以这种情况是不被允许的。