面试题答案
一键面试实现思路
- 使用
std::collections::HashMap
来存储缓存结果。 - 泛型函数接受一个闭包作为参数,闭包返回包含引用的数据结构。
- 为了处理生命周期,需要明确泛型参数的生命周期,确保缓存的结果引用在其使用期间保持有效。
- 首次调用闭包时,执行闭包并将结果存入缓存,后续调用直接返回缓存结果。
完整代码
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());
}
在上述代码中:
cache_result
函数是一个泛型函数,接受一个闭包func
,闭包返回类型为&'a T
,其中'a
是生命周期参数,T
是泛型类型。cache
是一个HashMap
,用于存储缓存结果,键为单元类型()
,因为这里只缓存一个结果。- 内部返回的闭包使用
move
语义,捕获外部环境的cache
和func
。首次调用内部闭包时,执行func
并将结果存入cache
,后续调用直接返回缓存结果。 - 在
main
函数中,定义了一个字符串data
,并通过cache_result
缓存对data
的引用,多次调用缓存函数可以看到结果被复用。