- 使用可变引用的情况:
- 所有权变化:当将
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
}
- 传递
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
}