0
0
Rustprogramming~20 mins

Lifetimes in functions in Rust - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Rust Lifetimes Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
What is the output of this Rust code with lifetimes?
Consider the following Rust function that returns a reference with a lifetime parameter. What will be printed when running this code?
Rust
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

fn main() {
    let string1 = String::from("apple");
    let string2 = "banana";
    let result = longest(string1.as_str(), string2);
    println!("Longest string is: {}", result);
}
ARuntime error due to dangling reference
BLongest string is: apple
CCompilation error due to lifetime mismatch
DLongest string is: banana
Attempts:
2 left
💡 Hint
Think about which string is longer and how lifetimes ensure safety.
Predict Output
intermediate
2:00remaining
What happens with this Rust code?
This Rust function returns a reference without explicit lifetimes. What happens when compiling and running?
Rust
fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }
    &s[..]
}

fn main() {
    let my_string = String::from("hello world");
    let word = first_word(&my_string);
    println!("First word: {}", word);
}
ANo error, prints: First word: hello
BError: cannot return reference to local variable
CError: missing lifetime specifier in function signature
DError: mismatched types between &str and String
Attempts:
2 left
💡 Hint
Rust has lifetime elision rules that infer lifetimes in common cases.
🔧 Debug
advanced
2:00remaining
Why does this Rust code fail to compile due to lifetimes?
This Rust code tries to return a reference from a function, but it fails to compile. Identify the cause of the error.
Rust
fn get_str() -> &str {
    let s = String::from("hello");
    &s
}

fn main() {
    let result = get_str();
    println!("{}", result);
}
ANo error, prints: hello
BError: returning reference to local variable 's' which will be dropped
CError: cannot move out of borrowed content
DError: missing lifetime specifier in function signature
Attempts:
2 left
💡 Hint
Think about the scope and lifetime of the variable 's'.
📝 Syntax
advanced
2:00remaining
Which function signature correctly uses lifetimes for two input references and returns one?
You want a function that takes two string slices and returns one of them with the correct lifetime annotations. Which signature is correct?
Afn choose(x: &str, y: &str) -> &str
Bfn choose<'a, 'b>(x: &'a str, y: &'b str) -> &'a str
Cfn choose<'a>(x: &'a str, y: &'a str) -> &'a str
Dfn choose<'a>(x: &'a str, y: &'a str) -> &str
Attempts:
2 left
💡 Hint
The returned reference lifetime must be tied to both inputs.
Predict Output
expert
3:00remaining
What is the output of this Rust code using lifetime bounds in structs and functions?
Analyze the following Rust code with a struct holding a reference with a lifetime. What will be printed?
Rust
struct ImportantExcerpt<'a> {
    part: &'a str,
}

impl<'a> ImportantExcerpt<'a> {
    fn announce_and_return_part(&self, announcement: &str) -> &str {
        println!("Attention please: {}", announcement);
        self.part
    }
}

fn main() {
    let novel = String::from("Call me Ishmael. Some years ago...");
    let first_sentence = novel.split('.').next().expect("Could not find a '.'");
    let excerpt = ImportantExcerpt { part: first_sentence };
    let result = excerpt.announce_and_return_part("Here is the excerpt");
    println!("Excerpt: {}", result);
}
A
Attention please: Here is the excerpt
Excerpt: Call me Ishmael
B
Attention please: Here is the excerpt
Excerpt: Call me Ishmael. Some years ago
CRuntime panic due to unwrap on None
DCompilation error due to missing lifetime annotations in impl
Attempts:
2 left
💡 Hint
Look at how the string is split and what part is stored in the struct.