Challenge 1: A move Closure Printing a Vec — Possible Solution ==================================================================== use std::thread; fn main() { let names = vec![String::from("Ada"), String::from("Grace")]; let handle = thread::spawn(move || { println!("{:?}", names); }); handle.join().unwrap(); } WHY THIS WORKS AS AN ANSWER ------------------------------ move || { println!("{:?}", names); } forces the closure to take OWNERSHIP of names rather than merely borrowing it — per this chapter's move-keyword explanation, this is required because the spawned thread's actual lifetime is unpredictable from main's perspective; it might still be running after main would otherwise have dropped names. WHAT WOULD GO WRONG WITHOUT move (IN GENERAL TERMS): the closure would instead try to capture a REFERENCE to names. The compiler would refuse to compile this, producing an error to the effect of "closure may outlive the current function, but it borrows `names`, which is owned by the current function" — essentially the compiler's way of saying it cannot guarantee names will still be valid for as long as the spawned thread might need it, since main's own scope (and therefore names' lifetime) could end before the thread finishes. This is the exact category of lifetime concern Course 1 Chapter 4 raised for ordinary references, now surfacing again in the genuinely new context of a thread whose actual runtime lifetime the compiler has no way to bound in advance.