Add closure example
This commit is contained in:
parent
d0a35c47a3
commit
69008722e1
2 changed files with 71 additions and 0 deletions
9
closure/Cargo.toml
Normal file
9
closure/Cargo.toml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "closure"
|
||||
version = "0.1.0"
|
||||
authors = ["laurens <miers132@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
62
closure/src/main.rs
Normal file
62
closure/src/main.rs
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
use std::thread;
|
||||
use std::time::Duration;
|
||||
|
||||
fn main() {
|
||||
let simulated_user_specified_value = 10;
|
||||
let simulated_random_number = 7;
|
||||
|
||||
generate_workout(simulated_user_specified_value, simulated_random_number);
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue