使用Rust读取文件-借入的价值仅存到这里

时间:2018-07-04 18:34:11

标签: rust

我有一个应该读取文件并返回其内容的函数。

fn read (file_name: &str) -> &str {

    let mut f = File::open(file_name)
        .expect(&format!("file not found: {}", file_name));

    let mut contents = String::new();

    f.read_to_string(&mut contents)
        .expect(&format!("cannot read file {}", file_name));

    return &contents;
}

但我收到此错误:

  --> src\main.rs:20:13
   |
20 |     return &contents;
   |             ^^^^^^^^ borrowed value does not live long enough
21 | }
   | - borrowed value only lives until here
   |

我在做什么错了?

我对这里发生的事情的想法是:

  1. let mut f = File::open(file_name).expect(....);-这将处理文件,并告诉OS我们要使用该文件来做事。

  2. let mut contents = String::new();-这会在堆上创建类似于矢量的数据结构,以便存储我们将从文件中读取的数据。

  3. f.read_to_string(&mut contents).expect(...);-这会将文件读入contents空间。

  4. return &contents;-返回指向存储文件数据的向量的指针。

为什么我不能返回我想要的指针?

如何关闭文件(f变量)?我认为在变量超出范围后,锈会为我关闭它,但是如果我需要在此之前关闭它,该怎么办?

1 个答案:

答案 0 :(得分:1)

对于文件句柄的变量超出范围自动关闭,您是正确的;但是,contents也会发生同样的情况-除​​非您决定将其返回为拥有的String,否则它将在函数末尾销毁。在Rust函数中,不能返回对其内部创建的对象的引用,而只能返回作为参数传递给它们的对象。

您可以按以下步骤修复功能:

fn read(file_name: &str) -> String {
    let mut f = File::open(file_name)
        .expect(&format!("file not found: {}", file_name));

    let mut contents = String::new();

    f.read_to_string(&mut contents)
        .expect(&format!("cannot read file {}", file_name));

    contents
}

或者,您可以将contents作为对read函数的可变引用:

fn read(file_name: &str, contents: &mut String) { ... }