MST

星途 面试题库

面试题:Rust 基本数据类型组合与生命周期关联

定义一个结构体`Record`,它包含两个字段,一个是`Vec<u8>`类型的`data`,另一个是`Option<&str>`类型的`description`。编写一个函数`process_record`,该函数接收`Record`的可变引用作为参数。在函数内部,根据`description`是否为`Some`,决定是否对`data`进行某种处理(例如计算`data`的哈希值)。要求在处理过程中确保Rust的所有权和生命周期规则得到正确遵循,避免悬垂引用和内存泄漏等问题。请给出完整的代码实现,并详细解释代码中所有权和生命周期的处理逻辑。
18.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

// 定义Record结构体
struct Record {
    data: Vec<u8>,
    description: Option<&str>,
}

// 处理Record的函数
fn process_record(record: &mut Record) {
    if let Some(_) = record.description {
        // 计算data的哈希值
        let mut hasher = DefaultHasher::new();
        record.data.hash(&mut hasher);
        let hash_value = hasher.finish();
        println!("Data hash value: {:x}", hash_value);
    }
}

所有权和生命周期处理逻辑解释

  1. 所有权

    • Record结构体拥有data字段的所有权,因为dataVec<u8>类型,Vec在Rust中是拥有所有权的数据结构。
    • description字段是Option<&str>类型,它不拥有其所指向字符串的所有权,而是持有一个引用。
    • process_record函数接收Record的可变引用&mut Record。这意味着函数可以修改Record实例的内部状态,但并不转移Record的所有权。
  2. 生命周期

    • description字段的生命周期由其引用的字符串决定。因为它是&str类型,这个引用必须在Record实例的整个生命周期内保持有效。
    • 函数process_record中的record参数是一个可变引用,其生命周期由调用者确定。由于函数只是对record进行操作而不存储引用,所以不会出现悬垂引用的问题。在函数结束时,对record的借用结束,调用者可以继续使用Record实例。