Dropping/Destructors

struct PrintOnDrop(&'static str, u32);

impl Drop for PrintOnDrop {
    fn drop(&mut self) {
        println!("{}", self.0);
    }
}

fn main() {
    let y = PrintOnDrop("dropping y will happening at exit of main", 1);
    println!("<<<<<<<<<before block>>>>>>>>>>>>");
    {
       let mut x = PrintOnDrop("x=2 shadowed on next line, but not dropped", 2);
       let z = PrintOnDrop("z=2 manually dropped", 2);
       println!("z={}", z.1);
       drop(z); // we can manually drop
       let x = PrintOnDrop("x=3 drops when scope ends", 3);
       println!("x={}", x.1)
       // x=3 dropped
       // x=2 dropped  (reverse order of creation)
    }
    println!("<<<<<<<<<<<after block>>>>>>>>>>>>");
    // y=1 dropped
}