


use std::time::Duration;
use std::thread;
fn main() {
let value = 10;
let number = 7;
generate_workout(value, number);
}
struct Cache<T>
where T: Fn(u32) -> u32 {
calculation: T,
value: Option<u32>,
}
impl<T> Cache<T>
where T: Fn(u32) -> u32
{
fn new(calculation: T) -> Cache<T> {
Self { calculation, value: None }
}
fn value(&mut self, arg: u32) -> u32 {
match self.value {
Some(v) => v,
None => {
let v = (self.calculation)(arg);
self.value = Some(v);
v
}
}
}
}
fn generate_workout(num: u32, random_number: u32) {
let mut expensive_result = Cache::new(|n| {
println!("calculating slowly...");
thread::sleep(Duration::from_secs(2));
n
});
if num < 25 {
println!("Today,do {} pushups!", expensive_result.value(num));
println!("Next,do {} situps!", expensive_result.value(num))
} else {
println!("Today,run for {} minutes!", expensive_result.value(num));
}
}








定义结构体,结构体有个泛型参数T,然后有个约束,T就代表这个闭包的类型,而闭包的类型,它的约束是这样的,Fn接收一个u32类型,返回值也是u32类型








文章提供了一个Rust代码示例,展示如何创建一个名为`Cache`的结构体,该结构体利用泛型和闭包来缓存计算结果。`Cache`结构体持有一个计算函数,当需要计算时,如果之前已经计算过,则从缓存中返回结果,否则执行计算并存储结果。在`generate_workout`函数中,根据用户输入调用`Cache`来生成不同的锻炼计划,同时演示了如何控制计算的延迟执行。
5万+

被折叠的 条评论
为什么被折叠?



