我按照代码打开Rust by Example的文件:
use std::{env, fs::File, path::Path};
fn main() {
let args: Vec<_> = env::args().collect();
let pattern = &args[1];
if let Some(a) = env::args().nth(2) {
let path = Path::new(&a);
let mut file = File::open(&path);
let mut s = String::new();
file.read_to_string(&mut s);
println!("{:?}", s);
} else {
//do something
}
}
但是,我收到了这样的消息:
error[E0599]: no method named `read_to_string` found for type `std::result::Result<std::fs::File, std::io::Error>` in the current scope
--> src/main.rs:11:14
|
11 | file.read_to_string(&mut s);
| ^^^^^^^^^^^^^^
我做错了什么?
答案 0 :(得分:22)
让我们看一下你的错误信息:
error[E0599]: no method named `read_to_string` found for type `std::result::Result<std::fs::File, std::io::Error>` in the current scope
--> src/main.rs:11:14
|
11 | file.read_to_string(&mut s);
| ^^^^^^^^^^^^^^
错误信息几乎就是它所说的 - Result
类型不的方法read_to_string
。那实际上是a method on the trait Read
。
您有Result
,因为File::open(&path)
可以失败。失败以Result
类型表示。 Result
可以是Ok
,这是成功案例,也可以是Err
,即失败案例。
你需要以某种方式处理失败案例。最简单的方法是使用expect
:
let mut file = File::open(&path).expect("Unable to open");
您还需要将Read
纳入范围才能访问read_to_string
:
use std::io::Read;
我强烈建议阅读The Rust Programming Language并阅读示例。第Recoverable Errors with Result
章将具有高度相关性。我认为这些文档是一流的!
答案 1 :(得分:1)
您还可以使用“?”
let mut file = File::open(&path)?;
但是在那种情况下,您的方法应该返回Result<String, io::Error>
喜欢
fn read_username_from_file() -> Result<String, io::Error> {
let mut f = File::open("hello.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}
如果您无法返回Result<String, io::Error>
,则必须使用期望(已接受的答案中提到)或使用以下方式处理错误情况,
让文件= File :: open(&opt_raw.config);
let file = match file {
Ok(file) => file,
Err(error) => {
panic!("Problem opening the file: {:?}", error)
},
};
有关更多信息,请参阅此link