面试题答案
一键面试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);
}
}
所有权和生命周期处理逻辑解释
-
所有权:
Record
结构体拥有data
字段的所有权,因为data
是Vec<u8>
类型,Vec
在Rust中是拥有所有权的数据结构。description
字段是Option<&str>
类型,它不拥有其所指向字符串的所有权,而是持有一个引用。process_record
函数接收Record
的可变引用&mut Record
。这意味着函数可以修改Record
实例的内部状态,但并不转移Record
的所有权。
-
生命周期:
description
字段的生命周期由其引用的字符串决定。因为它是&str
类型,这个引用必须在Record
实例的整个生命周期内保持有效。- 函数
process_record
中的record
参数是一个可变引用,其生命周期由调用者确定。由于函数只是对record
进行操作而不存储引用,所以不会出现悬垂引用的问题。在函数结束时,对record
的借用结束,调用者可以继续使用Record
实例。