MST

星途 面试题库

面试题:Rust中match表达式的模式匹配与所有权转移

定义一个结构体`Person { name: String, age: u32 }`,并将多个`Person`实例存储在一个`Vec<Box<Person>>`中。使用`match`表达式从`Vec`中取出一个`Person`,并在匹配成功后,将该`Person`的所有权转移到一个新的变量中,同时展示如何正确处理`Vec`中元素的移除操作,以避免内存泄漏或悬空指针。
44.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

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

fn main() {
    let mut people: Vec<Box<Person>> = Vec::new();
    people.push(Box::new(Person { name: "Alice".to_string(), age: 30 }));
    people.push(Box::new(Person { name: "Bob".to_string(), age: 25 }));

    let removed_person = match people.pop() {
        Some(person) => person,
        None => {
            println!("Vec is empty");
            return;
        }
    };

    println!("Removed person: name = {}, age = {}", removed_person.name, removed_person.age);
}
  1. 结构体定义:首先定义了Person结构体,包含name(字符串类型)和ageu32类型)两个字段。
  2. 存储实例:创建一个Vec<Box<Person>>类型的people向量,并向其中添加Person实例。这里使用Box是因为Person中包含String类型,Box允许在堆上分配内存。
  3. 取出并转移所有权:使用match表达式结合pop方法从Vec中取出最后一个元素。如果Vec不为空,pop返回Some(Person),此时将Person的所有权转移到removed_person变量中;如果Vec为空,pop返回None,打印提示信息并结束程序。
  4. 避免内存泄漏和悬空指针pop方法在取出元素后会将其从Vec中移除,因此不会造成内存泄漏。同时,由于Person的所有权被转移,不存在悬空指针问题。