Bird
Raised Fist0
Rustprogramming~5 mins

Lifetime elision rules in Rust - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of lifetime elision in Rust?
Lifetime elision allows Rust to infer lifetimes in function signatures without explicit annotations, making code easier to read and write.
Click to reveal answer
beginner
How many lifetime elision rules does Rust have?
Rust has three main lifetime elision rules that guide how lifetimes are inferred in function signatures.
Click to reveal answer
intermediate
Explain the first lifetime elision rule.
If there is exactly one input lifetime, that lifetime is assigned to all output lifetimes.
Click to reveal answer
intermediate
What does the second lifetime elision rule state?
If there are multiple input lifetimes, but one of them is &self or &mut self, then the lifetime of self is assigned to all output lifetimes.
Click to reveal answer
intermediate
When do you need to explicitly write lifetime annotations in Rust functions?
You must write explicit lifetime annotations when the elision rules do not apply, such as when multiple input lifetimes exist without a self reference and the output lifetime is ambiguous.
Click to reveal answer
How many lifetime elision rules does Rust use to infer lifetimes?
A5
B1
C3
DNone
According to the first elision rule, if a function has one input lifetime, what happens to the output lifetime?
AIt must be explicitly annotated
BIt is ignored
CIt gets a static lifetime
DIt gets the same lifetime as the input
What special input does the second elision rule consider when assigning output lifetimes?
AAny reference
B&self or &mut self
CStatic lifetime
DMutable references only
When must you write explicit lifetime annotations in Rust functions?
AWhen elision rules do not clearly assign output lifetimes
BAlways, for every function
COnly for functions without inputs
DNever, Rust infers all lifetimes
Which of these is NOT a lifetime elision rule?
AIf multiple input lifetimes exist without self, assign output to the first input
BIf one input is &self or &mut self, assign its lifetime to output
CIf there is exactly one input lifetime, assign it to output
DIf no input lifetimes, output lifetime is static
Describe the three lifetime elision rules in Rust and give a simple example for each.
Think about function inputs and outputs and how Rust guesses lifetimes.
You got /4 concepts.
    Explain when and why you need to write explicit lifetime annotations instead of relying on elision.
    Consider functions with multiple references as inputs.
    You got /3 concepts.

      Practice

      (1/5)
      1. Which of the following best describes the purpose of Rust's lifetime elision rules?
      easy
      A. To let Rust automatically fill in lifetimes in common cases without explicit annotations.
      B. To force the programmer to always write explicit lifetime annotations.
      C. To remove all lifetimes from the code for simplicity.
      D. To allow Rust to ignore lifetime errors during compilation.

      Solution

      1. Step 1: Understand lifetime elision rules

        Lifetime elision rules help Rust guess lifetimes automatically in common cases.
      2. Step 2: Compare options

        Only To let Rust automatically fill in lifetimes in common cases without explicit annotations. correctly states that Rust fills in lifetimes automatically without needing explicit annotations in many cases.
      3. Final Answer:

        To let Rust automatically fill in lifetimes in common cases without explicit annotations. -> Option A
      4. Quick Check:

        Lifetime elision = automatic lifetime filling [OK]
      Hint: Elision means Rust guesses lifetimes for you [OK]
      Common Mistakes:
      • Thinking Rust always requires explicit lifetimes
      • Believing lifetimes are removed entirely
      • Assuming Rust ignores lifetime errors
      2. Which of the following function signatures correctly uses lifetime elision rules in Rust?
      easy
      A. fn first_word<'a>(s: &'a str) -> &'a str
      B. fn first_word(s: &str) -> &str
      C. fn first_word(s: &str) -> &'a str
      D. fn first_word<'a>(s: &str) -> &str

      Solution

      1. Step 1: Recall lifetime elision rules for functions

        When a function has one input lifetime, Rust assumes the output lifetime is the same as the input.
      2. Step 2: Analyze options

        fn first_word(s: &str) -> &str uses no explicit lifetimes but is valid due to elision. fn first_word<'a>(s: &'a str) -> &'a str is explicit but correct. fn first_word(s: &str) -> &'a str is invalid because it uses an undefined lifetime in output. fn first_word<'a>(s: &str) -> &str mixes explicit and implicit lifetimes incorrectly.
      3. Final Answer:

        fn first_word(s: &str) -> &str -> Option B
      4. Quick Check:

        One input ref means output ref gets same lifetime [OK]
      Hint: One input ref means output ref lifetime is same [OK]
      Common Mistakes:
      • Using undefined lifetime parameters
      • Mixing explicit and implicit lifetimes incorrectly
      • Forgetting elision rules allow omission
      3. What will be the output of the following Rust code snippet?
      fn longest(x: &str, y: &str) -> &str {
          x
      }
      
      fn main() {
          let string1 = String::from("apple");
          let string2 = String::from("banana");
          let result = longest(&string1, &string2);
          println!("Longest string is: {}", result);
      }
      medium
      A. Runtime error due to dangling reference
      B. Longest string is: banana
      C. Longest string is: apple
      D. Compilation error due to missing lifetime annotations

      Solution

      1. Step 1: Check lifetime elision rules for the function

        The function takes two input references (x and y) and returns a reference. Elision rules do not apply when there are multiple input lifetimes and an output lifetime; Rust cannot determine which input lifetime to use for the output.
      2. Step 2: Confirm compilation behavior

        This results in a compilation error: `missing lifetime specifier`. The code does not compile.
      3. Final Answer:

        Compilation error due to missing lifetime annotations -> Option D
      4. Quick Check:

        Multiple input refs need explicit lifetimes [OK]
      Hint: Two input refs to output requires explicit lifetimes [OK]
      Common Mistakes:
      • Thinking elision allows compilation with multiple input refs
      • Believing it returns the longer string
      • Confusing runtime errors with lifetime errors
      4. Identify the error in the following Rust function related to lifetime elision rules:
      fn invalid_ref(x: &str, y: &str) -> &str {
          let result = String::from("hello");
          &result
      }
      medium
      A. The function returns a reference to a local variable that will be dropped.
      B. The function is missing lifetime annotations on parameters.
      C. The function should return a String, not a reference.
      D. The function should use explicit lifetime annotations to compile.

      Solution

      1. Step 1: Analyze the returned reference

        The function returns a reference to 'result', a local String created inside the function.
      2. Step 2: Understand lifetime rules and error

        'result' is dropped when the function ends, so returning a reference to it causes a dangling reference error.
      3. Final Answer:

        The function returns a reference to a local variable that will be dropped. -> Option A
      4. Quick Check:

        Returning local reference causes dangling pointer [OK]
      Hint: Never return reference to local variable [OK]
      Common Mistakes:
      • Thinking missing lifetime annotations cause this error
      • Believing explicit lifetimes fix dangling references
      • Confusing return type with ownership
      5. Given the following struct and method, which lifetime elision rule applies to the method's signature?
      struct Container<'a> {
          value: &'a str,
      }
      
      impl<'a> Container<'a> {
          fn get_value(&self) -> &str {
              self.value
          }
      }
      What lifetime does Rust assign to the return value of get_value by elision?
      hard
      A. The return value has an unrelated anonymous lifetime.
      B. The return value has the lifetime 'a from the struct definition.
      C. The return value has the same lifetime as &self (the method receiver).
      D. The return value has a static lifetime.

      Solution

      1. Step 1: Identify lifetime elision rules for methods

        Rule 3 states that if there is a &self or &mut self parameter, the output lifetime is the same as self's lifetime.
      2. Step 2: Apply rule to method signature

        The method takes &self and returns &str without explicit lifetime. Rust assigns the return lifetime to match &self's lifetime.
      3. Final Answer:

        The return value has the same lifetime as &self (the method receiver). -> Option C
      4. Quick Check:

        Method output lifetime = &self lifetime [OK]
      Hint: Method output lifetime matches &self lifetime by elision [OK]
      Common Mistakes:
      • Confusing struct lifetime with method output lifetime
      • Assuming static lifetime without reason
      • Ignoring elision rule for &self receiver
      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