MST

星途 面试题库

面试题:Rust原生类型之所有权与借用

在Rust中,假设有一个包含字符串切片的结构体,例如 `struct MyStruct { data: &str }`。请说明在函数间传递这个结构体实例时,所有权和借用规则是如何应用的?并编写代码示例展示如何正确地在不同函数间传递该结构体,同时避免悬垂引用等错误。
26.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

所有权和借用规则应用

  1. 所有权:Rust 中,每个值都有一个变量作为其所有者。但对于 MyStruct 中的 data 字段是字符串切片 &str,它是对某个字符串的借用,而不是拥有所有权。MyStruct 实例本身有所有权,当实例传递给函数时,所有权转移给该函数。
  2. 借用data 字段是借用,所以必须遵守借用规则:
    • 同一时间只能有一个可变借用,或者可以有多个不可变借用。
    • 借用的生命周期必须小于等于被借用数据的生命周期。

代码示例

struct MyStruct {
    data: &str,
}

// 定义一个函数来接收 MyStruct 实例
fn print_struct(s: MyStruct) {
    println!("Data in MyStruct: {}", s.data);
}

// 定义一个函数来创建 MyStruct 实例并传递给另一个函数
fn create_and_pass() {
    let s = "Hello, Rust!";
    let my_struct = MyStruct { data: s };
    print_struct(my_struct);
    // 这里 my_struct 已经转移到 print_struct 函数中,不能再使用
}

fn main() {
    create_and_pass();
}

在这个示例中,create_and_pass 函数创建了 MyStruct 实例,并将其传递给 print_struct 函数。由于 data 是借用,只要借用的字符串(这里是字符串字面量,生命周期为整个程序)存在,MyStruct 实例就可以安全使用。print_struct 函数接收 MyStruct 实例的所有权,函数结束后,MyStruct 实例被销毁。这样就避免了悬垂引用等错误。