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