MST

星途 面试题库

面试题:Rust 集合所有权在复杂数据结构中的转移

假设有一个结构体`Person`,包含一个`Vec<String>`类型的字段`hobbies`。现在定义一个函数,接收`Person`类型的可变引用,在函数中向`hobbies`添加新的爱好,之后再将`Person`返回。在此过程中,所有权是如何变化的?如果将`Person`传递给函数(非引用),然后在函数内将`hobbies`转移到另一个新的`Person`结构体实例中,代码该如何编写?请详细说明所有权转移逻辑并给出代码实现。
40.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 使用可变引用的情况
    • 所有权变化:当将Person的可变引用传递给函数时,函数获得对Person内部数据(这里是hobbies)的可变借用权限。函数可以修改hobbies,但Person的所有权仍然归调用者所有。函数返回后,可变借用结束,调用者继续拥有Person的所有权。
    • 代码示例
struct Person {
    hobbies: Vec<String>,
}

fn add_hobby(person: &mut Person, new_hobby: String) -> &mut Person {
    person.hobbies.push(new_hobby);
    person
}
  1. 传递Person(非引用)并转移hobbies的情况
    • 所有权变化:当将Person传递给函数时,函数获得Person的所有权。在函数内将hobbies转移到新的Person结构体实例中,hobbies的所有权从原来的Person转移到新的Person实例。原来的Person实例在hobbies被转移后,其hobbies字段变为空的Vec。函数返回新的Person实例,调用者获得新Person实例的所有权。
    • 代码示例
struct Person {
    hobbies: Vec<String>,
}

fn transfer_hobbies(mut person: Person) -> Person {
    let new_person = Person {
        hobbies: person.hobbies.clone(),
    };
    person.hobbies.clear();
    new_person
}