Bird
Raised Fist0
Rustprogramming~20 mins

Lifetimes in structs in Rust - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Lifetime Struct Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of struct with lifetime reference
What is the output of this Rust program?
Rust
struct Holder<'a> {
    value: &'a str,
}

fn main() {
    let text = String::from("hello");
    let h = Holder { value: &text };
    println!("{}", h.value);
}
Ahello
BCompilation error due to missing lifetime
CRuntime error: dangling reference
Dhellohello
Attempts:
2 left
💡 Hint
Look at how the lifetime 'a is used to tie the reference in the struct to the variable text.
🧠 Conceptual
intermediate
1:30remaining
Why use lifetimes in structs?
Why do we need to specify lifetimes in structs that hold references in Rust?
ATo automatically clone the referenced data
BTo allow the struct to own the data instead of borrowing
CTo tell the compiler how long the references inside the struct are valid
DTo enable the struct to be mutable
Attempts:
2 left
💡 Hint
Think about what problem lifetimes solve when using references.
🔧 Debug
advanced
2:30remaining
Identify the lifetime error
What error does this Rust code produce?
Rust
struct Container<'a> {
    data: &'a str,
}

fn create_container<'a>() -> Container<'a> {
    let s = String::from("data");
    Container { data: &s }
}
Aerror: borrowed value does not live long enough
Berror: missing lifetime specifier in return type
Cerror: cannot move out of borrowed content
Dno error, compiles successfully
Attempts:
2 left
💡 Hint
Consider the lifetime of s and the returned Container.
📝 Syntax
advanced
1:30remaining
Correct lifetime syntax in struct definition
Which option correctly defines a struct with a lifetime parameter for a reference field?
Astruct RefHolder { value: &'a str }
Bstruct RefHolder<'a> { value: &str<'a> }
Cstruct RefHolder { value: &str }
Dstruct RefHolder<'a> { value: &'a str }
Attempts:
2 left
💡 Hint
Remember where the lifetime parameter goes in the struct definition and field type.
🚀 Application
expert
2:30remaining
Lifetime usage in nested structs
Given these structs, what is the output of the program?
Rust
struct Inner<'a> {
    text: &'a str,
}

struct Outer<'a> {
    inner: Inner<'a>,
}

fn main() {
    let s = String::from("Rust");
    let inner = Inner { text: &s };
    let outer = Outer { inner };
    println!("{}", outer.inner.text);
}
AEmpty string printed
BRust
CRuntime error: use after free
DCompilation error due to missing lifetime in Outer
Attempts:
2 left
💡 Hint
Check how lifetimes propagate through nested structs.

Practice

(1/5)
1. What is the main purpose of using lifetimes in Rust structs?
easy
A. To make structs mutable by default
B. To increase the speed of the program
C. To allow structs to own data permanently
D. To tell Rust how long references inside the struct are valid

Solution

  1. Step 1: Understand what lifetimes represent

    Lifetimes describe how long references are valid to prevent invalid memory access.
  2. Step 2: Connect lifetimes to structs

    In structs, lifetimes tell Rust how long the references inside the struct remain valid.
  3. Final Answer:

    To tell Rust how long references inside the struct are valid -> Option D
  4. Quick Check:

    Lifetimes = reference validity [OK]
Hint: Lifetimes track reference validity duration in structs [OK]
Common Mistakes:
  • Thinking lifetimes control program speed
  • Confusing ownership with lifetimes
  • Assuming lifetimes make structs mutable
2. Which of the following is the correct syntax to declare a struct with a lifetime parameter named 'a'?
easy
A. struct Example { data: &str<'a> }
B. struct Example<'a> { data: &'a str }
C. struct Example { data: &'a str }
D. struct Example<'a> { data: &str'a }

Solution

  1. Step 1: Recall lifetime syntax in structs

    Lifetime parameters are declared after the struct name with angle brackets, e.g., 'a.
  2. Step 2: Match correct placement of lifetime

    The lifetime must be declared as 'a after struct name and used before the reference type.
  3. Final Answer:

    struct Example<'a> { data: &'a str } -> Option B
  4. Quick Check:

    Lifetime syntax = struct Name<'a> { field: &'a Type } [OK]
Hint: Lifetime goes after struct name and before reference type [OK]
Common Mistakes:
  • Placing lifetime after &str instead of before
  • Omitting lifetime parameter after struct name
  • Using incorrect lifetime syntax like &str<'a>
3. What will be the output of this Rust code?
struct Holder<'a> {
    value: &'a i32,
}

fn main() {
    let x = 10;
    let h = Holder { value: &x };
    println!("{}", h.value);
}
medium
A. 10
B. Compilation error due to missing lifetime
C. Runtime error: dangling reference
D. 0

Solution

  1. Step 1: Analyze struct and lifetime usage

    The struct Holder has a lifetime 'a for its reference field. The reference &x is valid inside main.
  2. Step 2: Check code execution

    Variable x is 10, h.value references x, so printing h.value outputs 10.
  3. Final Answer:

    10 -> Option A
  4. Quick Check:

    Reference points to 10, so output = 10 [OK]
Hint: Valid lifetime means reference prints correct value [OK]
Common Mistakes:
  • Assuming compilation error without lifetime annotation
  • Expecting runtime error for valid reference
  • Confusing output with zero or default
4. Identify the error in this Rust code:
struct Container<'a> {
    data: &'a str,
}

fn main() {
    let c;
    {
        let s = String::from("hello");
        c = Container { data: &s };
    }
    println!("{}", c.data);
}
medium
A. Error: 's' does not live long enough for 'c'
B. Error: Missing lifetime parameter in struct
C. Error: Cannot print &str directly
D. No error, code runs fine

Solution

  1. Step 1: Understand variable lifetimes

    Variable 's' is created inside inner block and dropped at block end.
  2. Step 2: Analyze reference validity

    Container 'c' holds reference to 's', but 's' is dropped before 'c' is used, causing invalid reference.
  3. Final Answer:

    Error: 's' does not live long enough for 'c' -> Option A
  4. Quick Check:

    Reference lifetime shorter than struct usage = error [OK]
Hint: Check if referenced data outlives struct instance [OK]
Common Mistakes:
  • Ignoring inner block scope of 's'
  • Thinking missing lifetime parameter causes error here
  • Assuming printing &str causes error
5. You want to create a struct that holds two string slices with different lifetimes. Which is the correct way to declare it?
hard
A. struct Pair { first: &str, second: &str }
B. struct Pair<'a> { first: &'a str, second: &'a str }
C. struct Pair<'a, 'b> { first: &'a str, second: &'b str }
D. struct Pair<'a> { first: &'a str, second: &str }

Solution

  1. Step 1: Understand multiple lifetimes in structs

    When fields have different lifetimes, declare multiple lifetime parameters.
  2. Step 2: Match declaration to fields

    Each field uses its own lifetime parameter, so struct must declare both 'a and 'b.
  3. Final Answer:

    struct Pair<'a, 'b> { first: &'a str, second: &'b str } -> Option C
  4. Quick Check:

    Different lifetimes need separate parameters [OK]
Hint: Use separate lifetime parameters for different references [OK]
Common Mistakes:
  • Using one lifetime for different lifetime references
  • Omitting lifetime parameters entirely
  • Mixing owned and borrowed types without lifetimes
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