面试题答案
一键面试// 定义结构体
struct MyStruct {
field1: i32,
field2: String,
}
// 定义自定义集合
type MyCollection = Vec<MyStruct>;
fn main() {
let mut collection: MyCollection = vec![
MyStruct { field1: 1, field2: "a".to_string() },
MyStruct { field1: 2, field2: "b".to_string() },
];
// 使用for循环遍历并修改结构体字段
for item in &mut collection {
item.field1 += 1;
}
}
借用规则理解
- 不可变借用: 在Rust中,同一时刻可以有多个不可变借用,例如
for item in &collection
这种遍历方式,item
是不可变借用。这种方式适用于只读取数据的场景。 - 可变借用: 当需要修改数据时,需要可变借用。如
for item in &mut collection
,这里item
是可变借用。同一时刻只能有一个可变借用,这是为了避免数据竞争。在上述代码中,因为要修改field1
,所以使用了可变借用。如果在有可变借用item
的作用域内,尝试再创建一个新的借用(无论是可变还是不可变),就会导致编译错误。例如:
let mut collection: MyCollection = vec![MyStruct { field1: 1, field2: "a".to_string() }];
let mut item = &mut collection[0];
// 以下代码会编译错误,因为已经有了可变借用 `item`
// let another_ref = &collection[0];
item.field1 += 1;
通过这种借用规则,Rust在编译期就能保证内存安全,避免数据竞争问题。