๐ Scenario: Imagine you are organizing a small event and need to keep track of the number of guests. Sometimes, you update the count temporarily for calculations without changing the original number.
๐ฏ Goal: You will create a variable to hold the initial guest count, then shadow it with a new value to show how variable shadowing works in Rust. Finally, you will print the final guest count.
๐ What You'll Learn
Create a variable called guest_count with the value 50.
Shadow the variable guest_count by creating a new variable with the same name and assign it the value guest_count + 10.
Print the value of guest_count.
๐ก Why This Matters
๐ Real World
Variable shadowing helps when you want to reuse a variable name for updated values without changing the original variable's mutability.
๐ผ Career
Understanding shadowing is important for writing clear and safe Rust code, which is valuable in systems programming and software development jobs.
Progress0 / 4 steps
1
Create the initial guest count variable
Create a variable called guest_count and set it to 50.
Rust
Hint
Use let guest_count = 50; to create the variable.
2
Shadow the guest_count variable
Shadow the variable guest_count by creating a new variable with the same name and assign it the value guest_count + 10.
Rust
Hint
Use let guest_count = guest_count + 10; to shadow the variable.
3
Print the guest_count variable
Use println! to print the value of guest_count.
Rust
Hint
Use println!("{}", guest_count); to print the value.
4
Run the program to see the output
Run the program and observe the printed output showing the final guest count.
Rust
Hint
The output should be 60 because the variable was shadowed with guest_count + 10.
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
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.
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.
Final Answer:
Reuse the same variable name to store a new value or type -> Option C
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
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.
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.
Final Answer:
let x = 5; let x = x + 1; println!("{}", x); -> Option A
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
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.
Step 2: Understand the final print output
The last x is a String "Value: 20", so printing it outputs exactly that.
Final Answer:
Value: 20 -> Option D
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
Step 1: Analyze shadowing and mutability
First x is immutable 5, then shadowed to 6 (immutable), then shadowed to mutable 12.
Step 2: Check assignment and print
Since the last x is mutable, assigning x = 10; is valid. Printing outputs 10.
Final Answer:
No error; code runs and prints 10 -> Option B
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
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.
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.
Final Answer:
6 -> Option A
Quick Check:
Inner shadowing does not affect outer variable [OK]