Challenge 1: Move Error, Then Fix With Clone — Possible Solution ==================================================================== Step 1 — the version that fails to compile: fn main() { let s1 = String::from("hello"); let s2 = s1; println!("{}", s1); } THE EXACT COMPILER ERROR (paraphrased from rustc's real message): error[E0382]: borrow of moved value: `s1` --> src/main.rs:4:20 | 2 | let s1 = String::from("hello"); | -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait 3 | let s2 = s1; | -- value moved here 4 | println!("{}", s1); | ^^ value borrowed here after move Step 2 — the fix, using .clone(): fn main() { let s1 = String::from("hello"); let s2 = s1.clone(); println!("{}", s1); println!("{}", s2); } WHY THIS WORKS AS AN ANSWER ------------------------------ The first version's let s2 = s1 MOVES ownership of the String's heap data from s1 to s2, per this chapter's move semantics — s1 becomes invalid immediately, so the later println! referencing it is rejected at compile time, exactly the "borrow of moved value" error this chapter's warn-box named as the most common early Rust mistake. Replacing s1 with s1.clone() creates a genuine, independent DEEP COPY of the string's heap data — s2 gets its own separate copy, s1 is never moved at all, and both variables remain fully valid and usable afterward, at the cost of the extra allocation/copy .clone() performs (explicitly, visibly, exactly as this chapter described).