是否可以返回在函数范围内创建的引用?

kop*_*zko 6 lifetime rust

我有一个相当简单的程序:

fn f<'a>() -> &'a i32 {
    &1
}

fn main() {
    println!("{}", f());
}
Run Code Online (Sandbox Code Playgroud)

它没有编译(一些输出省略):

$ rustc test.rs
test.rs:2:6: 2:7 error: borrowed value does not live long enough
test.rs:2     &1
Run Code Online (Sandbox Code Playgroud)

我明白为什么失败了.

  1. 我不知道如何返回在函数范围内创建的引用.有没有办法做到这一点?
  2. 为什么单一回报的生命不能被遗弃?

编辑:我改变了标题,因为它建议返回盒装类型将帮助不是(见答案).

Joh*_*ohn 2

由于 Rust 使用 RAII 风格的资源管理,一旦程序离开某个范围,该范围内所有未移动的值都将被销毁。该值必须存在于某处才能使引用有效。因此,要么直接返回该值(如果您担心执行此操作时会有额外的副本,那么不必担心,因为该副本将被优化掉),要么将其装箱并返回该框。除非您按如下方式返回静态分配的字符串&str,否则您根本无法返回“新”(对于调用者)引用:

fn f<'a>() -> &'a str {
    "yo"
}
Run Code Online (Sandbox Code Playgroud)