有效地获取借用参考的所有权以从函数返回

时间:2017-01-21 13:36:55

标签: return rust lifetime

我正在尝试编写一个简单的prompt函数,该函数返回一个没有尾随换行符的输入字符串,但我无法返回结果,因为input的活动时间不够长。我理解String::trim_right_matches正在返回对input: String部分的借用引用,但我无法弄清楚如何获取此数据的所有权或以某种方式复制它以返回它。

我一直在旋转我的车轮几个小时而没有运气,虽然我已经知道“与借用检查员的斗争”是Rust的新人的通过仪式,所以我想我并不孤单。

use std::io;
use std::io::Write;

fn main() {
    println!("you entered: {}", prompt("enter some text: "));
}

fn prompt(msg: &str) -> &str {
    print!("{}", msg);

    io::stdout().flush()
        .ok()
        .expect("could not flush stdout");

    let mut input = String::new();

    io::stdin()
        .read_line(&mut input)
        .expect("failed to read from stdin");

    input.trim_right_matches(|c| c == '\r' || c == '\n')
}

Intuition告诉我,我需要fn prompt(prompt: &str) -> str而不是-> &str,但我无法以编译器接受的方式实现这一点。

error: `input` does not live long enough
  --> src/main.rs:22:5
   |
22 |     input.trim_right_matches(|c| c == '\r' || c == '\n').clone()
   |     ^^^^^ does not live long enough
23 | }
   | - borrowed value only lives until here
   |
note: borrowed value must be valid for the anonymous lifetime #1 defined on the block at 9:32...
  --> src/main.rs:9:33
   |
9  | fn prompt(msg: &str) -> &str {
   |                                 ^

error: aborting due to previous error

1 个答案:

答案 0 :(得分:2)

如果它是传入参数的一部分,则只能返回&str,因为这样可以使其生命周期等于参数。局部分配的String片仅在函数持续时间内有效,因此您无法返回它。您必须返回(移出)拥有的String