Challenge 3: Double Shadowing — Possible Solution ==================================================================== fn main() { let value = "100"; let value: i32 = value.parse().unwrap(); let value = value * 2; println!("Final value: {}", value); } Output: Final value: 200 WHY THIS WORKS AS AN ANSWER ------------------------------ Each of the three let value lines creates a genuinely NEW binding that shadows the previous one — the first holds a string ("100"), the second shadows it with the parsed i32 (100), and the third shadows THAT with the doubled result (200). Each version is a completely separate variable that happens to share the name "value"; nothing about the original string variable was ever mutated. WHY THIS REQUIRED let EACH TIME, NOT PLAIN REASSIGNMENT: plain reassignment (value = ...) would require value to have been declared mut, and critically, mutation can NEVER change a variable's type — a mut string variable can only ever be reassigned to another string, not suddenly become an i32. Shadowing is the only mechanism in Rust that allows the type itself to change across "reassignments" (as this chapter's own string-to-i32 example demonstrated), which is exactly why the string-to-number-to-doubled-number progression here needed let at every step: each step is really a distinct variable of a distinct type, not the same variable being mutated in place.