rust - 用 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
|
我究竟做错了什么?
我对这里发生的事情的想法是这样的:
let mut f = File::open(file_name).expect(....);
- 这需要一个文件的句柄并告诉操作系统我们想用它做事。let mut contents = String::new();
- 这会在堆上创建一个类似向量的数据结构,以存储我们即将从文件中读取的数据。f.read_to_string(&mut contents).expect(...);
- 这会将文件读入contents
空间。return &contents;
- 这将返回一个指向存储文件数据的向量的指针。
为什么我不能返回我想要的指针?
如何关闭我的文件(f
变量)?我认为 rust 会在变量超出范围后为我关闭它,但是如果我需要在此之前关闭它怎么办?
解决方案
当变量超出范围时自动关闭文件句柄是正确的;但是,同样的情况也会发生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) { ... }
推荐阅读
- ruby-on-rails - 如何在 Rails 应用程序中上传大文件 (5GB >)
- c++ - 如何从 cpp 程序将参数传递给 bash 脚本
- python - 添加新列,返回另一列中唯一值的最小值
- sql-server - SQL Server - 授予用户在自己的架构中创建表的权限,但不在 dbo 架构中
- angular - Angular Element ref input get value 不能直接在模板中工作
- python - 即使后端环境正确,使用 matplotlib 时也不会显示图
- mysql - MySQL 每小时百分比
- plot - Julia - 使用 GraphPlots 绘制最小生成树
- react-native - 如何使用 Wix React Native Navigation 在 RCTRootView 中设置 initialProperties?
- javascript - 仅适用于三个元素中的两个