Bird
Raised Fist0
Rustprogramming~10 mins

Move semantics in Rust - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to move ownership of the String to variable b.

Rust
let a = String::from("hello");
let b = [1];
Drag options to blanks, or click blank then click option'
Aref a
B&a
Ca
Da.clone()
Attempts:
3 left
💡 Hint
Common Mistakes
Using &a borrows instead of moves ownership.
Using a.clone() creates a copy, not a move.
2fill in blank
medium

Complete the code to fix the error by cloning the String before moving.

Rust
let s1 = String::from("hello");
let s2 = [1];
Drag options to blanks, or click blank then click option'
As1
Bs1.clone()
C&s1
Dref s1
Attempts:
3 left
💡 Hint
Common Mistakes
Using s1 moves ownership, invalidating s1.
Using &s1 only borrows, not clones.
3fill in blank
hard

Fix the error by completing the code to borrow the String instead of moving it.

Rust
fn print_string(s: [1]) {
    println!("{}", s);
}

let s = String::from("hello");
print_string(s);
print_string(s);
Drag options to blanks, or click blank then click option'
A&String
BString
Cstr
D&str
Attempts:
3 left
💡 Hint
Common Mistakes
Using String moves ownership, so second call fails.
Using str is a string slice type, but not a reference.
4fill in blank
hard

Complete the code to create a vector of Strings by moving ownership inside the loop.

Rust
let words = vec![String::from("apple"), String::from("banana")];
let mut new_words = Vec::new();
for word in words[1] {
    new_words.push(word);
}
Drag options to blanks, or click blank then click option'
A.into_iter()
Bclone()
C.clone()
Attempts:
3 left
💡 Hint
Common Mistakes
Using iter() borrows, causing ownership errors.
Cloning unnecessarily copies data.
5fill in blank
hard

Fill all three blanks to implement a function that takes ownership of a String, modifies it, and returns it.

Rust
fn add_exclamation[1] {
    let mut s = [2];
    s.push('!');
    [3]
}

let greeting = String::from("Hello");
let excited = add_exclamation(greeting);
Drag options to blanks, or click blank then click option'
A(s: String) -> String
Bs
D(s: &String) -> String
Attempts:
3 left
💡 Hint
Common Mistakes
Using a reference in the signature causes ownership issues.
Not returning the String loses ownership.

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

  1. Step 1: Understand move semantics

    In Rust, moving a value transfers ownership from one variable to another.
  2. Step 2: Effect on original variable

    After the move, the original variable is invalid and cannot be used to prevent double free errors.
  3. Final Answer:

    The original variable can no longer be used. -> Option A
  4. 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

  1. Step 1: Identify move syntax

    Assigning let b = a; moves ownership of a to b.
  2. Step 2: Check other options

    &a borrows, a.clone() copies, *a is invalid for String.
  3. Final Answer:

    let b = a; -> Option C
  4. 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

  1. Step 1: Analyze ownership transfer

    Assigning s2 = s1 moves ownership of the String from s1 to s2.
  2. Step 2: Using moved variable

    Trying to print s1 after move causes a compile-time error because s1 is invalid.
  3. Final Answer:

    Compilation error -> Option A
  4. 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

  1. Step 1: Understand move of vector

    Assigning v2 = v moves ownership of vector v to v2.
  2. Step 2: Using moved variable causes error

    Calling v.len() after move is invalid and causes compile error.
  3. Final Answer:

    Using v.len() after v was moved to v2. -> Option D
  4. 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

  1. Step 1: Understand ownership transfer in function

    Passing s to take_ownership moves ownership, invalidating s in main.
  2. 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.
  3. Step 3: Best fix

    All three options correctly fix the problem.
  4. Final Answer:

    All of the above. -> Option B
  5. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard