📖 Scenario: You are working with simple data values in Rust that can be copied easily without moving ownership. This is common when dealing with numbers or characters.
🎯 Goal: You will create variables with copy types, assign them, and print their values to see how copying works in Rust.
📋 What You'll Learn
Create variables with copy types
Assign one variable to another
Print the values to show copying behavior
💡 Why This Matters
🌍 Real World
Copy types are used when you want to work with simple data like numbers or characters without worrying about ownership or borrowing.
💼 Career
Understanding copy types helps you write safe and efficient Rust code, which is important in systems programming and performance-critical applications.
Progress0 / 4 steps
1
Create a variable with a copy type
Create a variable called number of type i32 and set it to 10.
Rust
Hint
Use let to create a variable and assign the value 10.
2
Assign the variable to another variable
Create a new variable called copy_number and assign it the value of number.
Rust
Hint
Assign number to copy_number using =.
3
Print both variables to show copying
Use println! to print both number and copy_number on separate lines.
Rust
Hint
Use println!("number = {}", number); and similarly for copy_number.
4
Run the program and observe the output
Run the program and print the output showing the values of number and copy_number.
Rust
Hint
The output should show both variables have the value 10.
Practice
(1/5)
1. Which of the following types in Rust is a Copy type by default?
easy
A. A String
B. An integer like i32
C. A vector like Vec<i32>
D. A struct with a String field
Solution
Step 1: Identify primitive types with Copy trait
Primitive scalar types like integers (i32) implement Copy by default.
Step 2: Understand ownership of heap data
Types like String and Vec own heap data and do not implement Copy automatically.
Final Answer:
An integer like i32 -> Option B
Quick Check:
Primitive types = Copy [OK]
Hint: Primitive scalars like i32 are Copy by default [OK]
Common Mistakes:
Thinking String is Copy because it looks simple
Assuming all structs are Copy without checking fields
Confusing heap-allocated types with Copy types
2. Which syntax correctly derives the Copy trait for a struct in Rust?
easy
A. struct Point { x: i32, y: i32 } // Copy is automatic
B. #[derive(Clone)] struct Point { x: i32, y: i32 }
C. #[derive(Copy, Clone)] struct Point { x: i32, y: i32 }
D. #[derive(Copy)] struct Point { x: i32, y: i32 }
Solution
Step 1: Recall trait derivation rules
To make a struct Copy, you must derive both Copy and Clone traits.
Step 2: Check each option
#[derive(Copy, Clone)] struct Point { x: i32, y: i32 } correctly derives both traits. #[derive(Clone)] struct Point { x: i32, y: i32 } misses Copy. struct Point { x: i32, y: i32 } // Copy is automatic is wrong because Copy is not automatic for structs. #[derive(Copy)] struct Point { x: i32, y: i32 } misses Clone.
Final Answer:
#[derive(Copy, Clone)] struct Point { x: i32, y: i32 } -> Option C
Quick Check:
Copy requires Copy + Clone traits [OK]
Hint: Always derive both Copy and Clone for Copy types [OK]
Step 1: Understand Copy trait effect on assignment
Since Color derives Copy, assigning c1 to c2 copies the data, not moves it.
Step 2: Check usage after assignment
Because c1 is still valid, printing its fields outputs the original values.
Final Answer:
255 0 0 -> Option A
Quick Check:
Copy means no move, data duplicated [OK]
Hint: Copy types allow use after assignment without move errors [OK]
Common Mistakes:
Expecting a move error after assignment
Thinking c1 is invalid after c2 = c1
Confusing Copy with Clone behavior
4. Identify the error in this Rust code snippet:
#[derive(Copy)]
struct Point { x: i32, y: i32 }
fn main() {
let p1 = Point { x: 5, y: 10 };
let p2 = p1;
println!("{} {}", p1.x, p1.y);
}
medium
A. Assignment moves ownership, so p1 is invalid
B. Cannot print struct fields directly
C. No error, code runs fine
D. Missing Clone trait derivation causes compile error
Solution
Step 1: Check trait derivations
The struct derives only Copy, but Copy requires Clone to be implemented too.
Step 2: Understand compiler requirements
Rust compiler will error because Clone is missing, even if Copy is derived.
Final Answer:
Missing Clone trait derivation causes compile error -> Option D
Quick Check:
Copy needs Clone too [OK]
Hint: Derive Clone along with Copy to avoid errors [OK]
Common Mistakes:
Assuming Copy alone is enough
Thinking printing fields causes error
Confusing move error with trait error
5. You want to create a struct Pixel with fields x: u32, y: u32, and color: (u8, u8, u8). You want Pixel to be a Copy type. Which of the following is the correct approach?
hard
A. Derive Copy and Clone for Pixel since all fields are Copy types
B. Implement Copy manually without Clone
C. Use String for color and derive Copy
D. Derive only Clone for Pixel
Solution
Step 1: Check field types for Copy trait
Fields u32 and tuple of u8 are all Copy types.
Step 2: Derive Copy and Clone for struct
Since all fields are Copy, deriving both Copy and Clone for Pixel makes it a Copy type.
Final Answer:
Derive Copy and Clone for Pixel since all fields are Copy types -> Option A
Quick Check:
All fields Copy + derive Copy & Clone = Copy type [OK]
Hint: All fields Copy? Derive Copy and Clone for struct [OK]
Common Mistakes:
Using String for color which is not Copy
Deriving only Clone without Copy
Trying to implement Copy manually
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.