MST

星途 面试题库

面试题:Rust中map函数在复杂数据结构上的应用

假设有一个结构体`Person`,包含`name: String`和`age: u32`字段,存在一个`Vec<Person>`。使用`map`函数创建一个新的`Vec<String>`,其中每个元素是`Person`的`name`字段,如果`age`大于30则将`name`转换为大写,否则保持不变。说明在此过程中涉及到的所有权和借用规则。
24.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct Person {
    name: String,
    age: u32,
}

fn main() {
    let people: Vec<Person> = vec![
        Person { name: "Alice".to_string(), age: 25 },
        Person { name: "Bob".to_string(), age: 35 },
        Person { name: "Charlie".to_string(), age: 28 },
    ];

    let names: Vec<String> = people.into_iter()
        .map(|person| {
            if person.age > 30 {
                person.name.to_uppercase()
            } else {
                person.name
            }
        })
        .collect();

    println!("{:?}", names);
}

所有权和借用规则说明

  1. 所有权转移
    • 这里使用了into_iter,它会消耗掉people向量,因为into_iter获取了people的所有权。这意味着people在调用into_iter后不再有效,所有权转移到了迭代器中。
    • map闭包中,person接收到Person实例的所有权。因为闭包获取了person的所有权,所以在闭包内可以对person进行操作,如访问name字段并在必要时转换为大写。由于person的所有权被闭包获取,所以person在闭包结束后也不再有效。
  2. 借用规则
    • 整个过程中没有使用借用,因为如果使用iter(借用迭代器),闭包参数会是&Person,这就需要考虑借用生命周期等问题。而这里使用into_iter直接转移所有权,避免了复杂的借用规则。但如果使用借用,要保证借用的生命周期不超过被借用对象的生命周期,并且同一时间只能有一个可变借用或者多个不可变借用,不能同时存在可变和不可变借用,以避免数据竞争。