MST

星途 面试题库

面试题:Rust泛型与生命周期在复杂场景中的应用

假设有一个Rust程序,需要实现一个缓存系统。定义一个泛型函数,该函数接受一个闭包作为参数,闭包返回一个包含引用的数据结构。泛型函数需缓存闭包的执行结果,并在后续调用时直接返回缓存结果。在这个过程中,要合理处理泛型类型的生命周期,确保程序的类型安全,避免悬垂引用等问题。请详细说明实现思路并给出完整代码。
23.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用std::collections::HashMap来存储缓存结果。
  2. 泛型函数接受一个闭包作为参数,闭包返回包含引用的数据结构。
  3. 为了处理生命周期,需要明确泛型参数的生命周期,确保缓存的结果引用在其使用期间保持有效。
  4. 首次调用闭包时,执行闭包并将结果存入缓存,后续调用直接返回缓存结果。

完整代码

use std::collections::HashMap;

fn cache_result<'a, F, T>(func: F) -> impl Fn() -> &'a T
where
    F: FnOnce() -> &'a T,
    T: 'a,
{
    let mut cache: HashMap<(), &'a T> = HashMap::new();
    move || {
        if let Some(result) = cache.get(&()) {
            result
        } else {
            let new_result = func();
            cache.insert((), new_result);
            new_result
        }
    }
}

fn main() {
    let data = String::from("Hello, world!");
    let cached_func = cache_result(|| &data);
    println!("{}", cached_func());
    println!("{}", cached_func());
}

在上述代码中:

  1. cache_result函数是一个泛型函数,接受一个闭包func,闭包返回类型为&'a T,其中'a是生命周期参数,T是泛型类型。
  2. cache是一个HashMap,用于存储缓存结果,键为单元类型(),因为这里只缓存一个结果。
  3. 内部返回的闭包使用move语义,捕获外部环境的cachefunc。首次调用内部闭包时,执行func并将结果存入cache,后续调用直接返回缓存结果。
  4. main函数中,定义了一个字符串data,并通过cache_result缓存对data的引用,多次调用缓存函数可以看到结果被复用。