MST

星途 面试题库

面试题:Rust引用声明与所有权转移

假设有一个结构体 `Person` 包含 `String` 类型的 `name` 字段。编写一个函数,该函数接收 `Person` 的引用,在函数内部对 `name` 进行修改,并解释为什么某些引用声明方式可以实现此操作,而有些不行。同时,描述在此过程中所有权是如何变化的。
45.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

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

fn modify_name(person: &mut Person) {
    person.name.push_str(" modified");
}

引用声明方式分析

  1. 不可变引用 &Person:如果函数接收的是 &Person,意味着对 Person 的只读访问。在 Rust 中,不可变引用不能用于修改其所指向的数据,因为这会违反 Rust 的借用规则(同一时间只能有一个可变引用,或者有多个不可变引用,但不能同时存在可变和不可变引用),所以这种方式不能实现对 name 的修改。
  2. 可变引用 &mut Person:可变引用允许我们修改其所指向的数据。通过 &mut Person,函数可以直接修改 Person 实例内部的 name 字段,符合题目要求。

所有权变化

  1. 所有权不发生转移:在 Rust 中,借用(无论是可变还是不可变)的核心概念是不转移所有权。当我们将 Person 的引用传递给 modify_name 函数时,调用者仍然拥有 Person 实例的所有权。函数只是在借用期间对数据有临时的访问权限,函数调用结束后,借用结束,调用者可以继续正常使用 Person 实例。所以,在整个过程中,Person 实例的所有权始终归调用者所有,没有发生所有权转移。