📖 Scenario: Imagine you have a box with some toys. You want to give this box to your friend, but once you give it, you no longer have the box. This is like move semantics in Rust, where ownership of data is transferred from one variable to another.
🎯 Goal: You will create a Rust program that shows how moving ownership works. You will start by creating a string, then move it to another variable, and finally try to use the original variable to see what happens.
📋 What You'll Learn
Create a variable with a String value
Create a second variable and move the first variable's value into it
Try to use the first variable after the move
Print the value of the second variable
💡 Why This Matters
🌍 Real World
Move semantics help Rust programs manage memory efficiently and safely, preventing bugs like double frees or use-after-free errors.
💼 Career
Understanding move semantics is essential for Rust developers working on systems programming, embedded devices, or performance-critical applications.
Progress0 / 4 steps
1
Create a String variable
Create a variable called greeting and set it to the string "Hello, Rust!".
Rust
Hint
Use String::from to create a String from a text.
2
Move the String to a new variable
Create a variable called new_owner and move the value of greeting into it by assigning new_owner = greeting.
Rust
Hint
Assign greeting to new_owner to move ownership.
3
Try to use the original variable after move
Add a line to print new_owner using println!("{}", new_owner);. Then add a line to print greeting using println!("{}", greeting); to see what error Rust gives.
Rust
Hint
Print both variables to see that greeting cannot be used after the move.
4
Print the moved value only
Remove or comment out the line that prints greeting. Then run the program to print only new_owner.
Rust
Hint
Only print new_owner because greeting is no longer valid.
Practice
(1/5)
1. What happens to a variable in Rust after its value is moved to another variable?
easy
A. The original variable can no longer be used.
B. The original variable keeps a copy of the value.
C. The original variable is automatically cloned.
D. The original variable becomes a reference to the new variable.
Solution
Step 1: Understand move semantics
In Rust, moving a value transfers ownership from one variable to another.
Step 2: Effect on original variable
After the move, the original variable is invalid and cannot be used to prevent double free errors.
Final Answer:
The original variable can no longer be used. -> Option A
Quick Check:
Move means original variable unusable [OK]
Hint: Moving means original variable is invalid after transfer [OK]
Common Mistakes:
Thinking the original variable still holds a copy
Assuming Rust automatically clones on move
Confusing move with borrowing
2. Which of the following Rust code snippets correctly moves ownership of a String from a to b?
easy
A. let b = a.clone();
B. let b = &a;
C. let b = a;
D. let b = *a;
Solution
Step 1: Identify move syntax
Assigning let b = a; moves ownership of a to b.
Step 2: Check other options
&a borrows, a.clone() copies, *a is invalid for String.
Final Answer:
let b = a; -> Option C
Quick Check:
Simple assignment moves ownership [OK]
Hint: Use simple assignment to move ownership, not references or clone [OK]
Common Mistakes:
Using references instead of moving
Using clone which copies instead of moves
Dereferencing a String which is invalid
3. What is the output of this Rust code?
let s1 = String::from("hello");
let s2 = s1;
println!("{}", s1);
medium
A. Compilation error
B. hello
C. Runtime error
D. Empty string
Solution
Step 1: Analyze ownership transfer
Assigning s2 = s1 moves ownership of the String from s1 to s2.
Step 2: Using moved variable
Trying to print s1 after move causes a compile-time error because s1 is invalid.
Final Answer:
Compilation error -> Option A
Quick Check:
Using moved variable causes compile error [OK]
Hint: Using moved variable causes compile error, not runtime [OK]
Common Mistakes:
Expecting output 'hello' despite move
Thinking it causes runtime error
Assuming Rust clones automatically
4. Identify the error in this Rust code related to move semantics:
fn main() {
let v = vec![1, 2, 3];
let v2 = v;
println!("{}", v.len());
}
medium
A. Vector v cannot be moved to v2.
B. Cannot print vector length with println!.
C. Missing semicolon after let v2 = v.
D. Using v.len() after v was moved to v2.
Solution
Step 1: Understand move of vector
Assigning v2 = v moves ownership of vector v to v2.
Step 2: Using moved variable causes error
Calling v.len() after move is invalid and causes compile error.
Final Answer:
Using v.len() after v was moved to v2. -> Option D
Quick Check:
Using moved variable causes compile error [OK]
Hint: After move, original variable cannot be used [OK]
Common Mistakes:
Thinking vector cannot be moved
Ignoring ownership rules after move
Confusing move with borrowing
5. Given this Rust function:
fn take_ownership(s: String) {
println!("{}", s);
}
fn main() {
let s = String::from("hello");
take_ownership(s);
println!("{}", s);
}
What is the best way to fix the code so main can print s after calling take_ownership?
hard
A. Clone s before passing: take_ownership(s.clone()).
B. All of the above.
C. Return s from take_ownership and assign it back.
D. Change take_ownership to take a reference: fn take_ownership(s: &String).
Solution
Step 1: Understand ownership transfer in function
Passing s to take_ownership moves ownership, invalidating s in main.
Step 2: Ways to keep s usable
Change take_ownership to take a reference: fn take_ownership(s: &String). borrows s so ownership is not moved. Clone s before passing: take_ownership(s.clone()). clones s so original remains. Return s from take_ownership and assign it back. returns ownership back to main.
Step 3: Best fix
All three options correctly fix the problem.
Final Answer:
All of the above. -> Option B
Quick Check:
Borrow, clone, or return ownership fixes [OK]
Hint: Borrow, clone, or return ownership to keep variable usable [OK]
Common Mistakes:
Ignoring ownership transfer in function calls
Not cloning when needed
Not returning ownership back
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.