Bird
Raised Fist0
Rustprogramming~10 mins

Variable shadowing in Rust - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Variable shadowing
Declare variable x = 5
↓
Shadow x with new x = x + 1
↓
Shadow x again with new x = x * 2
↓
Use x (final shadowed value)
↓
End of scope
Variable shadowing means reusing the same name for a new variable that hides the old one temporarily.
Execution Sample
Rust
fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("{}", x);
}
This code shows how the variable x is shadowed twice, changing its value each time.
Execution Table
StepCode LineVariable x ValueActionOutput
1let x = 5;5Declare x with value 5
2let x = x + 1;6Shadow x with 5 + 1
3let x = x * 2;12Shadow x with 6 * 2
4println!("{}", x);12Print final x value12
💡 Program ends after printing the final shadowed value of x, which is 12.
Variable Tracker
VariableStartAfter Shadow 1After Shadow 2Final
x561212
Key Moments - 3 Insights
Why does the value of x change even though we never used a different variable name?
Because each 'let x = ...' creates a new variable that hides the old one temporarily, as shown in execution_table steps 2 and 3.
Is the original x (with value 5) lost after shadowing?
Yes, after shadowing, the old x is hidden and replaced by the new x, but only inside the current scope, as seen in variable_tracker.
Can we use the old x after shadowing?
No, once shadowed, the old x is inaccessible until the scope ends, so the code always uses the latest x value.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of x after the first shadowing (step 2)?
A5
B6
C12
D1
💡 Hint
Check the 'Variable x Value' column at step 2 in the execution_table.
At which step does the variable x get its final value before printing?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look at the 'Variable x Value' column and the 'Action' description in the execution_table.
If we removed the second shadowing (step 3), what would be printed?
A6
B5
C12
DError
💡 Hint
Refer to the variable_tracker and imagine skipping the last shadowing step.
Concept Snapshot
Variable shadowing in Rust:
- Use 'let' with the same name to create a new variable.
- New variable hides old one temporarily.
- Allows changing value without mut.
- Old variable inaccessible until scope ends.
- Useful for transformations and cleaner code.
Full Transcript
This example shows variable shadowing in Rust. First, x is declared as 5. Then, x is shadowed by a new x equal to 5 plus 1, so 6. Next, x is shadowed again by a new x equal to 6 times 2, so 12. Finally, the program prints 12. Each shadowing creates a new variable with the same name that hides the previous one. This lets us change the value without using mut. The old x values are hidden and cannot be accessed after shadowing. This is useful for step-by-step value changes in a clean way.

Practice

(1/5)
1. What does variable shadowing in Rust allow you to do?
easy
A. Prevent variables from being changed after initialization
B. Create a global variable accessible everywhere
C. Reuse the same variable name to store a new value or type
D. Automatically convert variable types without explicit casting

Solution

  1. Step 1: Understand variable shadowing concept

    Variable shadowing means declaring a new variable with the same name as an existing one, which replaces the old variable in the current scope.
  2. Step 2: Identify what shadowing allows

    This lets you reuse the same name to update the value or even change the type without needing a new variable name.
  3. Final Answer:

    Reuse the same variable name to store a new value or type -> Option C
  4. Quick Check:

    Shadowing = reuse variable name [OK]
Hint: Shadowing means reusing variable names for new values [OK]
Common Mistakes:
  • Thinking shadowing creates global variables
  • Confusing shadowing with immutability
  • Assuming shadowing changes variable type automatically
2. Which of the following Rust code snippets correctly demonstrates variable shadowing?
easy
A. let x = 5; let x = x + 1; println!("{}", x);
B. let x = 5; x = x + 1; println!("{}", x);
C. let mut x = 5; x = x + 1; println!("{}", x);
D. let x = 5; mut x = 6; println!("{}", x);

Solution

  1. Step 1: Check for correct shadowing syntax

    Shadowing uses let again with the same variable name to create a new variable that hides the old one.
  2. Step 2: Analyze each option

    let x = 5; let x = x + 1; println!("{}", x);: let x = 5; let x = x + 1; println!("{}", x); valid shadowing using previous value. let x = 5; x = x + 1; println!("{}", x);: let x = 5; x = x + 1; ... reassignment to immutable, compile error. let mut x = 5; x = x + 1; println!("{}", x);: let mut x = 5; x = x + 1; ... valid mutation but no shadowing (missing second let). let x = 5; mut x = 6; println!("{}", x);: let x = 5; mut x = 6; ... invalid syntax, mut requires let.
  3. Final Answer:

    let x = 5; let x = x + 1; println!("{}", x); -> Option A
  4. Quick Check:

    Shadowing requires let again [OK]
Hint: Shadowing always uses 'let' again with the same name [OK]
Common Mistakes:
  • Trying to reassign immutable variables without 'mut'
  • Confusing shadowing with mutable reassignment
  • Using 'mut' incorrectly with shadowing
3. What will be the output of this Rust code?
let x = 10;
let x = x * 2;
let x = "Value: ".to_string() + &x.to_string();
println!("{}", x);
medium
A. 20
B. Value: x
C. Compilation error
D. Value: 20

Solution

  1. Step 1: Follow variable shadowing and type changes

    First, x is 10 (integer). Then shadowed to 20 (integer). Then shadowed again to a String "Value: 20" by concatenating strings.
  2. Step 2: Understand the final print output

    The last x is a String "Value: 20", so printing it outputs exactly that.
  3. Final Answer:

    Value: 20 -> Option D
  4. Quick Check:

    Shadowing can change type; final value is string [OK]
Hint: Shadowing can change variable type and value [OK]
Common Mistakes:
  • Assuming variable type cannot change with shadowing
  • Expecting numeric output instead of string
  • Confusing variable name with literal output
4. Identify the error in this Rust code using variable shadowing:
let x = 5;
let x = x + 1;
let mut x = x * 2;
x = 10;
println!("{}", x);
medium
A. Cannot shadow a variable with 'mut' after immutable shadowing
B. No error; code runs and prints 10
C. Shadowing requires the same type, but types differ here
D. Cannot assign to 'x' because it is not mutable

Solution

  1. Step 1: Analyze shadowing and mutability

    First x is immutable 5, then shadowed to 6 (immutable), then shadowed to mutable 12.
  2. Step 2: Check assignment and print

    Since the last x is mutable, assigning x = 10; is valid. Printing outputs 10.
  3. Final Answer:

    No error; code runs and prints 10 -> Option B
  4. Quick Check:

    Shadowing can add mutability; assignment allowed [OK]
Hint: Shadowing can change mutability; last variable controls it [OK]
Common Mistakes:
  • Thinking mutability cannot be added by shadowing
  • Confusing shadowing with reassignment rules
  • Assuming type must stay the same when shadowing
5. Given this Rust code, what is the final value of result?
let x = 3;
let x = x + 2;
{
    let x = x * 2;
    let x = "Number: ".to_string() + &x.to_string();
    println!("{}", x);
}
let result = x + 1;
println!("{}", result);
hard
A. 6
B. 7
C. Number: 10
D. Compilation error due to type mismatch

Solution

  1. Step 1: Track shadowing in outer and inner scopes

    Outside the block, x is first 3, then shadowed to 5. Inside the block, x shadows to 10 (5*2), then to a String "Number: 10". This inner shadowing does not affect outer x.
  2. Step 2: Calculate final result outside the block

    Outside, x remains 5, so result = x + 1 = 6. The print inside the block shows "Number: 10" but does not change outer x.
  3. Final Answer:

    6 -> Option A
  4. Quick Check:

    Inner shadowing does not affect outer variable [OK]
Hint: Inner scope shadowing doesn't change outer variable [OK]
Common Mistakes:
  • Assuming inner shadowing changes outer variable
  • Confusing printed output with variable value
  • Expecting type change to persist outside inner scope
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard