The move keyword transfers ownership of variables to a closure, while Copy types are duplicated automatically without ownership transfer.
The move keyword forces a closure to take ownership of captured variables, whereas copy (via the Copy trait) duplicates simple types like integers without transferring ownership. Use move when you need a closure to own data that outlives its scope, such as when passing it to another thread.
let data = String::from("hello");
let closure = move || println!("{}", data); // Takes ownership of data
let x = 5;
let closure2 = || println!("{}", x); // Copies x because i32 implements Copy
Think of move as handing over the keys to your house; once you do, you can't use the house anymore because someone else owns it. Copy is like making a photocopy of a document; you keep the original, and the other person gets their own identical version. You use move for complex data that needs exclusive ownership and Copy for simple numbers that can be duplicated freely.