fn main() { println!("Hello, world!"); let vv = 1; println!("Before {}", vv); rec_refr_mut_value(&vv); // NOTE, do not have to label as mut println!("After {}", vv); let mut vv = 1; println!("\n\nBefore {}", vv); rec_refr_mut_reference(&mut vv); // NOTE, MUST label as mut println!("After {}", vv); } fn rec_refr(aa : &i32) { //*aa = 12; //not allowed when behind a & // aa = &12; // cannot mutate aa } // this changes what the parameter points at, NOT // what the original points at fn rec_refr_mut_value(mut aa : &i32) { println!("Before int {}", aa); //*aa = 12; //not allowed when behind a & aa = &12; // cannot mutate aa println!("After int {}", aa); } // in this version can mutate the value pointed to by the parameter fn rec_refr_mut_reference(aa : &mut i32) { println!("Before int {}", aa); *aa = 12; //not allowed when behind a & //aa = &12; // cannot mutate aa println!("After int {}", aa); } #[derive(Debug)] struct aa { aval : i32 } fn main2() { println!("Hello, world!"); let vv = aa{aval:12}; println!("Before {:?}", vv); rec_refr_mut_value_s(&vv); // NOTE, do not have to label as mut println!("After {:?}", vv); let mut vv = aa{aval:12}; println!("\n\nBefore {:?}", vv); rec_refr_mut_reference_s(&mut vv); // NOTE, MUST label as mut println!("After {:?}", vv); } fn rec_refr_s(aa : &aa) { //*aa = 12; //not allowed when behind a & // aa = &12; // cannot mutate aa } // this changes what the parameter points at, NOT // what the original points at fn rec_refr_mut_value_s(mut aa : &aa) { println!("Before int {:?}", aa); //*aa = 12; //not allowed when behind a & aa.aval = 12; // cannot mutate aa println!("After int {:?}", aa); } // in this version can mutate the value pointed to by the parameter fn rec_refr_mut_reference_s(mut aa : &aa) { println!("Before int {:?}", aa); let mut bb = aa{aval:42}; //not allowed when behind a & aa = &bb; // compile error : `bb` does not live long enough // `bb` dropped here while still borrowed //aa = &12; // cannot mutate aa println!("After int {:?}", aa); }