File io 在Rust中以字符串形式获取文件内容的更简洁的方法?
不久之后,当我第一次陷入锈蚀时,我开始编写代码,将文件内容转储到字符串中,以供以后处理(现在我只是将其打印出来) 有没有比我现在更干净的方法?看起来我不得不对它说得太详细了,但我没有看到任何好的方法来清理它File io 在Rust中以字符串形式获取文件内容的更简洁的方法?,file-io,rust,File Io,Rust,不久之后,当我第一次陷入锈蚀时,我开始编写代码,将文件内容转储到字符串中,以供以后处理(现在我只是将其打印出来) 有没有比我现在更干净的方法?看起来我不得不对它说得太详细了,但我没有看到任何好的方法来清理它 use std::io; use std::io::File; use std::os; use std::str; fn main() { println!("meh"); let filename = &os::args()[1]; let conten
use std::io;
use std::io::File;
use std::os;
use std::str;
fn main() {
println!("meh");
let filename = &os::args()[1];
let contents = match File::open(&Path::new(filename)).read_to_end() {
Ok(s) => str::from_utf8(s.as_slice()).expect("this shouldn't happen").to_string(),
Err(e) => "".to_string(),
};
println!("ugh {}", contents.to_string());
}
编者按:复习一个简短/清晰的答案
是我所知道的最短的:
use std::io::prelude::*;
use std::fs::File;
fn main() {
let mut file = File::open("/etc/hosts").expect("Unable to open the file");
let mut contents = String::new();
file.read_to_string(&mut contents).expect("Unable to read the file");
println!("{}", contents);
}
必须考虑故障案例是Rust喜欢放在前面和中间的东西。您不应该在生产代码中使用
unwrap
。要么匹配
,映射
要么然后
@hauleth这是一个非常严格的声明。您是否对panic
、unreachable
或assert
提出了相同的声明?所有这些都会导致线程死机。在生产代码中有很多原因导致出现恐慌。具体地说,我认为编码逻辑错误在遇到时会引起恐慌。当然,这个示例不是生产代码,错误案例的处理取决于示例的用户和应用程序的上下文。如果可以的话,你应该避免所有这些。就我个人而言,只有在我确信这不会引起恐慌的情况下,我才会使用它们(例如,常量上的FromPrimitive
)。如果我需要惊慌,那么它应该发生在main
中。在库中,您应该返回结果
或选项
,如果不是致命错误,则使用日志
板条箱。@halleth如果错误无法恢复,通常,在接收到错误并获得堆栈跟踪时立即中止更有用,而不是将错误一直传递到main
,从而丢失有关错误的所有上下文panic
和expect
都有它们的用途。我真希望在我们还没有缓冲区的时候有一个fn read\u as\u string()->Result
。在很多地方更符合人体工程学。