Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

missing lifetime specifier [E0106] on function signature

Tags:

rust

I'm pretty confused by the errors from this simple code (Playground):

fn main() {
    let a = fn1("test123");
}

fn fn1(a1: &str) -> &str {
    let a = fn2();
    a
}

fn fn2() -> &str {
    "12345abc"
}

These are:

error[E0106]: missing lifetime specifier
  --> <anon>:10:13
   |
10 | fn fn2() -> &str {
   |             ^ expected lifetime parameter
   |
   = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
   = help: consider giving it a 'static lifetime

I haven't been faced with these errors before, has anything changed in a recent Rust version? How can I fix the errors?

like image 668
Incerteza Avatar asked Nov 24 '14 04:11

Incerteza


1 Answers

A long time ago, when a function returned a borrowed pointer, the compiler inferred the 'static lifetime, so fn2 would compile successfully. Since then, lifetime elision has been implemented. Lifetime elision is a process where the compiler will automatically link the lifetime of an input parameter to the lifetime of the output value without having to explicitly name it.

For example, fn1, without lifetime elision, would be written like this:

fn fn1<'a>(a1: &'a str) -> &'a str {
    let a = fn2();
    a
}

However, fn2 has no parameters that are borrowed pointers or structs with lifetime parameters (indeed, it has no parameters at all). You must therefore mention the lifetime explicitly. Since you're returning a string literal, the correct lifetime is 'static (as suggested by the compiler).

fn fn2() -> &'static str {
    "12345abc"
}
like image 125
Francis Gagné Avatar answered Nov 15 '22 16:11

Francis Gagné