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.
Slice lifetime basics in 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.
'a and prints each item.fn print_slice<'a>(slice: &'a [i32]) { for &item in slice { println!("{}", item); } }
slice borrows part of arr and has the same lifetime as arr.let arr = [1, 2, 3, 4]; let slice: &[i32] = &arr[1..3];
'a.fn first_element<'a>(slice: &'a [i32]) -> Option<&'a i32> { slice.get(0) }
This program creates a vector of numbers, takes a slice of two elements, and prints them using a function that uses a slice lifetime.
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);
}
}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.
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
fn example<'a>(slice: &'a [i32]) {}Solution
Step 1: Understand what a lifetime means in Rust
Lifetimes tell Rust how long a reference is valid to prevent using invalid data.Step 2: Apply this to a slice reference
The lifetime on a slice reference means how long the slice can be safely used.Final Answer:
How long the slice reference is valid in the program -> Option AQuick Check:
Slice lifetime = reference validity [OK]
- Confusing lifetime with size or length
- Thinking lifetime is about element type
- Ignoring lifetime annotations on references
fn process_slice(____) {}Solution
Step 1: Recall lifetime syntax for references
Lifetimes are written as&'abefore the type to indicate the lifetime of the reference.Step 2: Check each option
&'a [i32]correctly places&'abefore the slice type[i32].&[i32]misses lifetime,&'a [i32];has an extra semicolon,&[i32]'aplaces lifetime incorrectly.Final Answer:
&'a [i32] -> Option AQuick Check:
Lifetime syntax = &'a [type] [OK]
- Putting lifetime after the type
- Adding extra semicolons inside parameters
- Omitting lifetime when needed
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);
}Solution
Step 1: Understand the function behavior
The function returns a reference to the first element of the slice, which is 10.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.Final Answer:
10 -> Option BQuick Check:
Returned first element = 10 [OK]
- Thinking lifetime causes compile error here
- Confusing element values
- Expecting runtime panic without reason
fn invalid<'a>() -> &'a [i32] {
let data = vec![1, 2, 3];
&data[..]
}Solution
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.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.Final Answer:
The function returns a reference to data that will be dropped -> Option CQuick Check:
Returning local reference = error [OK]
- Assuming lifetime annotation fixes local data drop
- Ignoring ownership rules
- Thinking slice syntax is wrong
fn longest_slice<'a>(x: &'a [i32], y: &'a [i32]) -> &____ [i32] {
if x.len() > y.len() { x } else { y }
}Solution
Step 1: Understand the function's return lifetime
The function returns a slice that could come from either input slice, both sharing lifetime 'a.Step 2: Use shared lifetime for safety
The correct lifetime for the return is'a, matching the lifetime of both input slices.Final Answer:
'a -> Option DQuick Check:
Return lifetime = 'a of inputs [OK]
- Choosing only one input lifetime
- Using 'static without reason
- Ignoring lifetime intersection rules
Ready to prove it?
Pass the test and this pattern moves unknown
