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
。在很多地方更符合人体工程学。