Bird
Raised Fist0
Rustprogramming~5 mins

Slice lifetime basics in Rust

Choose your learning style10 modes available
Introduction

Slice lifetimes tell Rust how long a slice is valid. This helps keep your program safe by avoiding use of data that no longer exists.

When you want to borrow part of a collection without copying it.
When you pass a slice to a function and want to ensure it doesn't outlive the data.
When you want to safely share read-only access to data.
When you want to avoid ownership transfer but still access data.
When you want Rust to check that references do not become invalid.
Syntax
Rust
&'a [T]

&'a [T] means a slice of type T with lifetime 'a.

The lifetime 'a tells Rust how long the slice can be used safely.

Examples
This function takes a slice of integers with lifetime 'a and prints each item.
Rust
fn print_slice<'a>(slice: &'a [i32]) {
    for &item in slice {
        println!("{}", item);
    }
}
Here, slice borrows part of arr and has the same lifetime as arr.
Rust
let arr = [1, 2, 3, 4];
let slice: &[i32] = &arr[1..3];
This function returns a reference to the first element of the slice, with the same lifetime 'a.
Rust
fn first_element<'a>(slice: &'a [i32]) -> Option<&'a i32> {
    slice.get(0)
}
Sample Program

This program creates a vector of numbers, takes a slice of two elements, and prints them using a function that uses a slice lifetime.

Rust
fn main() {
    let numbers = vec![10, 20, 30, 40];
    let slice = &numbers[1..3];
    print_slice(slice);
}

fn print_slice<'a>(slice: &'a [i32]) {
    for &item in slice {
        println!("{}", item);
    }
}
OutputSuccess
Important Notes

Lifetimes help Rust prevent bugs by ensuring references do not outlive the data they point to.

You usually don't need to write lifetimes explicitly because Rust can infer them in simple cases.

When you see errors about lifetimes, it means Rust wants you to be clear about how long references live.

Summary

Slice lifetimes tell Rust how long a slice is valid.

They help avoid using data that no longer exists.

Use lifetimes when borrowing slices to keep your program safe.

Practice

(1/5)
1. What does a slice lifetime in Rust indicate?
fn example<'a>(slice: &'a [i32]) {}
easy
A. How long the slice reference is valid in the program
B. The size of the slice in memory
C. The number of elements in the slice
D. The type of elements inside the slice

Solution

  1. Step 1: Understand what a lifetime means in Rust

    Lifetimes tell Rust how long a reference is valid to prevent using invalid data.
  2. Step 2: Apply this to a slice reference

    The lifetime on a slice reference means how long the slice can be safely used.
  3. Final Answer:

    How long the slice reference is valid in the program -> Option A
  4. Quick Check:

    Slice lifetime = reference validity [OK]
Hint: Lifetimes track reference validity duration [OK]
Common Mistakes:
  • Confusing lifetime with size or length
  • Thinking lifetime is about element type
  • Ignoring lifetime annotations on references
2. Which of the following is the correct syntax to declare a function that takes a slice with a lifetime parameter?
fn process_slice(____) {}
easy
A. &'a [i32]
B. &'a [i32];
C. &[i32]
D. &[i32]'a

Solution

  1. Step 1: Recall lifetime syntax for references

    Lifetimes are written as &'a before the type to indicate the lifetime of the reference.
  2. Step 2: Check each option

    &'a [i32] correctly places &'a before the slice type [i32]. &[i32] misses lifetime, &'a [i32]; has an extra semicolon, &[i32]'a places lifetime incorrectly.
  3. Final Answer:

    &'a [i32] -> Option A
  4. Quick Check:

    Lifetime syntax = &'a [type] [OK]
Hint: Lifetimes go right after & before type [OK]
Common Mistakes:
  • Putting lifetime after the type
  • Adding extra semicolons inside parameters
  • Omitting lifetime when needed
3. What will be the output of this Rust code?
fn get_first<'a>(slice: &'a [i32]) -> &'a i32 {
    &slice[0]
}

fn main() {
    let numbers = vec![10, 20, 30];
    let first = get_first(&numbers);
    println!("{}", first);
}
medium
A. 20
B. 10
C. Compilation error due to lifetime mismatch
D. Runtime panic

Solution

  1. Step 1: Understand the function behavior

    The function returns a reference to the first element of the slice, which is 10.
  2. Step 2: Check lifetime correctness and usage

    The lifetime 'a ensures the returned reference is valid as long as the input slice is valid. The vector lives long enough, so no error.
  3. Final Answer:

    10 -> Option B
  4. Quick Check:

    Returned first element = 10 [OK]
Hint: Returned slice element matches first index [OK]
Common Mistakes:
  • Thinking lifetime causes compile error here
  • Confusing element values
  • Expecting runtime panic without reason
4. Identify the error in this Rust code snippet:
fn invalid<'a>() -> &'a [i32] {
    let data = vec![1, 2, 3];
    &data[..]
}
medium
A. Missing lifetime annotation on data
B. Syntax error in slice syntax
C. The function returns a reference to data that will be dropped
D. No error, code is correct

Solution

  1. Step 1: Analyze the function return and data lifetime

    The function returns a slice reference with lifetime 'a, but data is created inside the function and dropped when it ends.
  2. Step 2: Understand why this causes an error

    Returning a reference to local data is invalid because the data won't live long enough, causing a dangling reference.
  3. Final Answer:

    The function returns a reference to data that will be dropped -> Option C
  4. Quick Check:

    Returning local reference = error [OK]
Hint: Never return reference to local variable [OK]
Common Mistakes:
  • Assuming lifetime annotation fixes local data drop
  • Ignoring ownership rules
  • Thinking slice syntax is wrong
5. Given this function that returns a slice from two input slices, which lifetime annotation is correct to ensure safety?
fn longest_slice<'a>(x: &'a [i32], y: &'a [i32]) -> &____ [i32] {
    if x.len() > y.len() { x } else { y }
}
hard
A. 'a + 'b
B. 'b
C. 'static
D. 'a

Solution

  1. Step 1: Understand the function's return lifetime

    The function returns a slice that could come from either input slice, both sharing lifetime 'a.
  2. Step 2: Use shared lifetime for safety

    The correct lifetime for the return is 'a, matching the lifetime of both input slices.
  3. Final Answer:

    'a -> Option D
  4. Quick Check:

    Return lifetime = 'a of inputs [OK]
Hint: Return lifetime must cover both inputs [OK]
Common Mistakes:
  • Choosing only one input lifetime
  • Using 'static without reason
  • Ignoring lifetime intersection rules
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