MST

星途 面试题库

面试题:Rust中for循环遍历自定义集合及处理借用问题

定义一个包含结构体的自定义集合,结构体中有多个字段。使用for循环遍历该集合,在遍历过程中对结构体的某个字段进行修改。要求处理好Rust的借用规则,避免编译错误,并阐述你对借用规则在此场景应用的理解。
47.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义结构体
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;
    }
}

借用规则理解

  1. 不可变借用: 在Rust中,同一时刻可以有多个不可变借用,例如 for item in &collection 这种遍历方式,item 是不可变借用。这种方式适用于只读取数据的场景。
  2. 可变借用: 当需要修改数据时,需要可变借用。如 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在编译期就能保证内存安全,避免数据竞争问题。