use std::time::Duration;
#[derive(Debug, Clone, Copy)]
enum ShirtColor {
Blue,
Red,
}
struct Inventory {
shirts: Vec<ShirtColor>,
}
impl Inventory {
fn giveaway(&self, user_preference: Option<ShirtColor>) -> ShirtColor {
user_preference.unwrap_or_else(|| self.most_stocked())
}
fn most_stocked(&self) -> ShirtColor {
let mut num_red = 0;
let mut num_blue = 0;
for color in &self.shirts {
match color {
ShirtColor::Blue => num_blue += 1,
ShirtColor::Red => num_red += 1,
}
}
if num_blue > num_red {
ShirtColor::Blue
} else {
ShirtColor::Red
}
}
}
fn inventory_usage() {
let store = Inventory {
shirts: vec![
ShirtColor::Blue,
ShirtColor::Red,
ShirtColor::Blue,
ShirtColor::Red,
ShirtColor::Blue,
],
};
let user_pref1 = Some(ShirtColor::Red);
let giveaway1 = store.giveaway(user_pref1);
println!(
"The user with preference {:?} gets {:?}",
user_pref1, giveaway1
);
let user_pref2 = None;
let giveaway2 = store.giveaway(user_pref2);
println!(
"The user with preference {:?} gets {:?}",
user_pref2, giveaway2
);
}
fn example_closures_study() {
let example_closures = |x| x;
let s = example_closures(String::from("closures."));
}
fn capture_immut_reference() {
let list = vec![2, 433, 23];
println!("capture_immut_reference Before define closure {:?}", list);
let only_borrows = || println!("From closures: {:?}", list);
println!(
"capture_immut_reference before calling only_borrows closures: {:?}",
list
);
only_borrows();
println!(
"capture_immut_reference after calling only_borrows closures: {:?}",
list
);
}
fn capture_mut_reference() {
let mut list = vec![2, 433, 23];
println!("capture_mut_reference Before define closure {:?}", list);
let mut only_borrows = || list.push(32);
only_borrows();
println!(
"capture_mut_reference after calling only_borrows closures: {:?}",
list
);
}
fn move_ownership_to_closuer() {
let list = vec![12, 43, 56];
println!(
"move_ownership_to_closuer before define closure, {:?}",
list
);
std::thread::spawn(move || println!("move_ownership_to_closuer from thread: {:?}", list))
.join()
.unwrap();
}
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
fn fn_trait_closures() {
let mut list = [
Rectangle {
width: 10,
height: 1,
},
Rectangle {
width: 3,
height: 5,
},
Rectangle {
width: 7,
height: 12,
},
];
list.sort_by_key(|r| r.width);
let mut num = 0;
list.sort_by_key(|r| {
num += 1;
r.width
});
println!("num: {num}");
println!("{:#?}", list);
}
pub fn closures_related_usage() {
inventory_usage();
let expensive_closures = |num: u32| -> u32 {
println!("caculating slowly...");
std::thread::sleep(Duration::from_secs(2));
return num;
};
let result = expensive_closures(32);
println!("expensive_closures result {result}");
capture_immut_reference();
capture_mut_reference();
move_ownership_to_closuer();
fn_trait_closures();
}