use std::rc::Rc;
use std::cell::RefCell;
pub fn smart_pointer_examples() {
println!("\n🧠Smart Pointer Examples");
println!("{}", "-".repeat(27));
let boxed = Box::new(5);
println!("Boxed value: {}", boxed);
let rc = Rc::new(10);
let rc_clone = Rc::clone(&rc);
println!("Rc value: {}, clone: {}", rc, rc_clone);
let ref_cell = RefCell::new(20);
*ref_cell.borrow_mut() += 5;
println!("RefCell value: {}", ref_cell.borrow());
}
#[derive(Debug)]
pub struct Shoe {
size: u32,
style: String,
}
impl Shoe {
pub fn new(size: u32, style: &str) -> Self {
Shoe {
size,
style: style.to_string(),
}
}
}
pub fn shoes_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
shoes.into_iter().filter(|s| s.size == shoe_size).collect()
}
#[derive(Debug)]
pub enum List {
Cons(i32, Box<List>),
Nil,
}
impl List {
pub fn new(values: Vec<i32>) -> Box<List> {
let mut result = Box::new(List::Nil);
for value in values.into_iter().rev() {
result = Box::new(List::Cons(value, result));
}
result
}
}