MST

星途 面试题库

面试题:Rust函数返回值所有权转移与引用:复杂数据结构处理

假设有一个自定义结构体 `Person`,包含 `name`(字符串类型)和 `age`(整数类型)字段。编写一个函数,接收 `Person` 结构体的可变引用,修改其 `name` 字段,然后返回这个结构体。详细说明函数执行过程中所有权是如何转移或保持的,以及引用的作用。
16.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

以下是使用Rust语言实现的代码示例:

struct Person {
    name: String,
    age: i32,
}

fn modify_name(person: &mut Person) -> Person {
    person.name = String::from("New Name");
    // 这里因为函数返回值是Person类型,所以所有权从借用转移到函数返回值
    // 函数结束时,person的所有权被返回,调用者获得其所有权
    // 可变引用允许在函数内部修改结构体的字段
    // 引用的作用是在不转移所有权的情况下,让函数能够访问和修改外部传入的结构体
    // 当函数返回后,调用者可以继续使用这个结构体
    std::mem::replace(person, Person { name: String::new(), age: 0 })
}

在这个函数中:

  1. 所有权:函数接收Person结构体的可变引用&mut Person,因此在函数内部,Person结构体的所有权仍归调用者所有。当函数返回时,通过std::mem::replace将修改后的Person结构体返回,此时所有权转移到函数的返回值,调用者接收返回值后重新获得所有权。
  2. 引用的作用:可变引用&mut Person允许函数修改传入的Person结构体的字段,同时避免了不必要的所有权转移,使得在函数执行期间,调用者和函数可以共享对Person结构体的访问,并且函数能够对其进行修改。