mirror of https://github.com/KaiserY/trpl-zh-cn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.4 KiB
65 lines
1.4 KiB
use std::thread;
|
|
use std::time::Duration;
|
|
|
|
struct Cacher<T>
|
|
where
|
|
T: Fn(u32) -> u32,
|
|
{
|
|
calculation: T,
|
|
value: Option<u32>,
|
|
}
|
|
|
|
impl<T> Cacher<T>
|
|
where
|
|
T: Fn(u32) -> u32,
|
|
{
|
|
fn new(calculation: T) -> Cacher<T> {
|
|
Cacher {
|
|
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ANCHOR: here
|
|
fn generate_workout(intensity: u32, random_number: u32) {
|
|
let mut expensive_result = Cacher::new(|num| {
|
|
println!("calculating slowly...");
|
|
thread::sleep(Duration::from_secs(2));
|
|
num
|
|
});
|
|
|
|
if intensity < 25 {
|
|
println!("Today, do {} pushups!", expensive_result.value(intensity));
|
|
println!("Next, do {} situps!", expensive_result.value(intensity));
|
|
} else {
|
|
if random_number == 3 {
|
|
println!("Take a break today! Remember to stay hydrated!");
|
|
} else {
|
|
println!(
|
|
"Today, run for {} minutes!",
|
|
expensive_result.value(intensity)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
// ANCHOR_END: here
|
|
|
|
fn main() {
|
|
let simulated_user_specified_value = 10;
|
|
let simulated_random_number = 7;
|
|
|
|
generate_workout(simulated_user_specified_value, simulated_random_number);
|
|
}
|