Bird
Raised Fist0
Rustprogramming~5 mins

Struct update syntax in Rust - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of the struct update syntax in Rust?
It allows you to create a new struct instance by copying fields from another instance, while changing some fields.
Click to reveal answer
beginner
How do you write the struct update syntax in Rust?
Use `..` followed by the existing struct instance to copy remaining fields. Example: `NewStruct { field1: value, ..old_struct }`
Click to reveal answer
beginner
Given `let user2 = User { email: String::from("new@example.com"), ..user1 };`, what happens to fields not listed explicitly?
They are copied from `user1` into `user2`.
Click to reveal answer
intermediate
Can struct update syntax be used with tuple structs or unit structs?
No, it only works with regular structs that have named fields.
Click to reveal answer
intermediate
What happens if you use struct update syntax with a struct that does not implement the `Copy` trait?
The fields are moved, so the original struct cannot be used after the update unless the fields implement `Copy` or are cloned.
Click to reveal answer
What does the `..` operator do in Rust struct update syntax?
ACreates a reference to the struct
BDeletes remaining fields from the struct
CCopies remaining fields from another struct instance
DInitializes all fields to default values
Which structs can use the struct update syntax?
AStructs with named fields
BTuple structs only
CUnit structs only
DAll struct types
If a struct field does not implement the `Copy` trait, what happens when using struct update syntax?
AThe field is copied automatically
BThe field is moved from the original struct
CThe compiler throws an error
DThe field is ignored
What is the benefit of using struct update syntax?
AIt speeds up program execution
BIt converts structs to tuples
CIt automatically validates struct fields
DIt reduces code duplication when creating similar structs
Which of the following is a correct use of struct update syntax?
Alet new_user = User { email: String::from("a@b.com"), ..old_user };
Blet new_user = User { ..old_user, email: String::from("a@b.com") };
Clet new_user = User { email: String::from("a@b.com") };
Dlet new_user = User { email: String::from("a@b.com"), old_user };
Explain how struct update syntax works in Rust and when you would use it.
Think about making a new struct similar to an old one but with some changes.
You got /4 concepts.
    Describe what happens to fields that do not implement the `Copy` trait when using struct update syntax.
    Consider Rust's ownership rules and how they affect struct fields.
    You got /4 concepts.

      Practice

      (1/5)
      1. What does the Rust struct update syntax ..old_struct do when creating a new struct?
      easy
      A. Copies all remaining fields from old_struct to the new struct
      B. Deletes the old_struct after creating the new struct
      C. Moves all fields from old_struct without copying
      D. Creates a reference to old_struct instead of a new struct

      Solution

      1. Step 1: Understand struct update syntax

        The syntax ..old_struct copies all fields from old_struct that are not explicitly set in the new struct.
      2. Step 2: Effect on new struct creation

        This lets you create a new struct with some fields changed, while reusing the rest from old_struct.
      3. Final Answer:

        Copies all remaining fields from old_struct to the new struct -> Option A
      4. Quick Check:

        Struct update syntax copies fields [OK]
      Hint: Remember: ..old_struct copies leftover fields [OK]
      Common Mistakes:
      • Thinking it moves fields instead of copying
      • Assuming it deletes the old struct
      • Confusing it with references
      2. Which of the following is the correct way to use struct update syntax in Rust?
      easy
      A. let new_user = User { name: "Alice"; ..old_user };
      B. let new_user = User { name: "Alice", ..old_user };
      C. let new_user = User { name: "Alice" ..old_user };
      D. let new_user = User { ..old_user, name: "Alice" };

      Solution

      1. Step 1: Check correct syntax order

        In Rust, fields you want to change come first, then ..old_struct copies the rest.
      2. Step 2: Identify correct punctuation and placement

        let new_user = User { name: "Alice", ..old_user }; correctly places ..old_user after the changed field with commas separating fields.
      3. Final Answer:

        let new_user = User { name: "Alice", ..old_user }; -> Option B
      4. Quick Check:

        Changed fields first, then ..old_struct [OK]
      Hint: Put changed fields before ..old_struct [OK]
      Common Mistakes:
      • Placing ..old_struct before changed fields
      • Missing commas between fields
      • Using semicolons inside struct initialization
      3. Given the code:
      struct Point { x: i32, y: i32 }
      
      let p1 = Point { x: 5, y: 10 };
      let p2 = Point { x: 8, ..p1 };
      println!("({}, {})", p2.x, p2.y);

      What is the output?
      medium
      A. (8, 0)
      B. (5, 10)
      C. Compilation error
      D. (8, 10)

      Solution

      1. Step 1: Analyze struct initialization for p2

        p2 sets x to 8 explicitly, and copies y from p1 (which is 10) using struct update syntax.
      2. Step 2: Determine printed values

        Printing p2.x and p2.y outputs (8, 10).
      3. Final Answer:

        (8, 10) -> Option D
      4. Quick Check:

        Changed x=8, copied y=10 [OK]
      Hint: Changed fields override, others copy from old struct [OK]
      Common Mistakes:
      • Assuming y resets to 0
      • Thinking x stays 5
      • Expecting a compile error
      4. What is wrong with this Rust code?
      struct User { name: String, age: u32 }
      
      let old_user = User { name: String::from("Bob"), age: 30 };
      let new_user = User { age: 25, ..old_user };
      println!("{} is {} years old", new_user.name, new_user.age);
      medium
      A. It causes a syntax error due to missing commas
      B. It causes a move error because old_user is partially moved
      C. It compiles and runs without errors
      D. It prints wrong age value

      Solution

      1. Step 1: Understand ownership with struct update

        Using ..old_user moves non-Copy fields like name (String) that are not explicitly overridden, while age is overridden with a new value.
      2. Step 2: Check usage of old_user

        old_user is not used after the update, so no ownership error occurs. The code compiles and runs, printing "Bob is 25 years old".
      3. Final Answer:

        It compiles and runs without errors -> Option C
      4. Quick Check:

        Non-Copy fields moved, but old_user not reused [OK]
      Hint: Non-Copy fields move with ..old_struct, but OK if old not reused [OK]
      Common Mistakes:
      • Thinking it causes a partial move error
      • Expecting automatic cloning of String
      • Assuming syntax error instead of checking ownership
      5. You have a struct:
      struct Config { debug: bool, version: u32, name: String }

      You want to create a new Config with debug set to true, keep version the same, and change name to "NewApp". Which code correctly uses struct update syntax and avoids ownership errors?
      hard
      A. let new_config = Config { debug: true, name: String::from("NewApp"), ..old_config };
      B. let new_config = Config { debug: true, ..old_config, name: String::from("NewApp") };
      C. let new_config = Config { debug: true, name: "NewApp", ..old_config };
      D. let new_config = Config { debug: true, name: old_config.name, ..old_config };

      Solution

      1. Step 1: Place changed fields before struct update

        Changed fields debug and name must come before ..old_config.
      2. Step 2: Avoid ownership errors by creating new String

        Since name is a String, assign a new String with String::from("NewApp") to avoid moving old_config.name.
      3. Final Answer:

        let new_config = Config { debug: true, name: String::from("NewApp"), ..old_config }; -> Option A
      4. Quick Check:

        Changed fields first, clone String to avoid move [OK]
      Hint: Clone or create new String before ..old_struct [OK]
      Common Mistakes:
      • Placing ..old_config before changed fields
      • Using string literal instead of String::from
      • Moving old_config.name causing ownership error
      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