MST

星途 面试题库

面试题:Rust中生命周期与所有权如何在函数参数传递中协同工作

假设有一个结构体`User`,包含`name`(字符串切片类型)和`age`(`u32`类型)两个字段。现在要编写一个函数,该函数接收一个`User`实例作为参数,并打印出用户的姓名和年龄。请用代码展示在这个过程中,Rust的生命周期与所有权是如何协同工作的,同时解释函数参数传递过程中所有权的转移情况以及如何确保生命周期的有效性。
37.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义User结构体
struct User {
    name: String,
    age: u32,
}

// 定义打印函数
fn print_user(user: User) {
    println!("Name: {}, Age: {}", user.name, user.age);
}

fn main() {
    let user1 = User {
        name: String::from("Alice"),
        age: 30,
    };

    // 调用print_user函数,user1的所有权转移给print_user
    print_user(user1);

    // 这里不能再使用user1,因为其所有权已转移
    // println!("{:?}", user1); // 这行代码会报错
}

所有权转移情况

  1. main函数中创建了user1实例,此时user1拥有其内部name字符串的所有权。
  2. 调用print_user函数时,user1的所有权被转移给print_user函数的参数user。这意味着main函数不再拥有user1的所有权。
  3. print_user函数结束后,user被销毁,其内部的name字符串也会被释放。

生命周期有效性确保

  1. 在Rust中,结构体User的生命周期由其字段的生命周期决定。这里nameString类型,有自己的生命周期管理。
  2. 函数print_user的参数user的生命周期与函数调用的生命周期一致。由于user拥有User实例的所有权,在函数调用期间,user及其内部字段(nameage)都是有效的。
  3. Rust编译器在编译时会进行所有权和生命周期检查,确保在print_user函数调用结束后,不会再访问已经转移所有权的user1,从而保证了内存安全。如果尝试在print_user调用后访问user1,编译器会报错,如上述被注释掉的代码行。