生命周期如何处理常量字符串/字符串文字?

时间:2015-07-05 12:59:53

标签: string rust lifetime string-literals

我读了tutorial on the official website,我对常量字符串/字符串文字的生命周期有一些疑问。

编写以下代码时出错:

fn get_str() -> &str {
    "Hello World"
}

错误:

error[E0106]: missing lifetime specifier
 --> src/main.rs:1:17
  |
1 | fn get_str() -> &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

但是当我添加参数时,它是可以的:

fn get_str(s: &str) -> &str {
    "Hello World"
}

为什么这样做? "Hello World"如何从参数s借用,即使它与s无关?

1 个答案:

答案 0 :(得分:10)

Lifetime elision推断出完整的

类型
fn get_str(s: &str) -> &str

fn get_str<'a>(s: &'a str) -> &'a str

这基本上意味着只要get_str有效,s的返回值必须有效。 string literal "Hello world" is &'static str的实际类型,这意味着它对整个程序运行有效。由于这满足了函数签名中的生命周期约束(因为'static总是包含任何'a的{​​{1}}),这都有效。

但是,让原始代码工作的更合理的方法是为函数类型添加显式生存期:

'a
  

“Hello World”如何从参数fn get_str() -> &'static str { "Hello World" } 中借用,即使它与s无关?

对于具有单个引用参数的函数中返回值的生命周期,只有两个选项是有意义的:

  1. 它可以是s,因为它应该在您的示例中,或
  2. 返回值的生命周期必须与参数的生命周期联系在一起,这是生命周期省略的默认值。
  3. 在本文顶部的链接中选择后者有一些理由,但它基本上归结为后者是更常见的情况。请注意,生命周期省略根本不会查看函数体,它只是通过函数签名。这就是为什么它不会考虑你只是将字符串常量返回到考虑范围的原因。