Assigning or passing a non-Copy value moves it; the old binding can no longer be used. This lets Rust free memory deterministically with no garbage collector and rule out double frees at compile time. To use a value without taking it, use borrowing.

let a = String::from("hi");
let b = a; // a is moved
// println!("{a}"); // compile error