线程“main”在“Box<Any>”处惊慌失措

Geo*_*iev 2 rust

我正在努力学习 Rust。我正在关注一本实现 unix 程序的在线书籍cat。现在我试图读取作为参数传递的文件的内容,cargo run file1.txt file2.txt但是程序出现了恐慌:

D:\rust\cat> cargo run .\src\test.txt
   Compiling cat v0.1.0 (D:\rust\cat)
    Finished dev [unoptimized + debuginfo] target(s) in 0.62s
     Running `target\debug\cat.exe .\src\test.txt`
thread 'main' panicked at 'Box<Any>', src\main.rs:12:28
Run Code Online (Sandbox Code Playgroud)

这是我的程序:

use std::env;
use std::fs::File;
use std::io;
use std::io::prelude::*;

fn main() {
    let args: Vec<String> = env::args().collect();

    if args.len() > 1 {
        match read_file(&args) {
            Ok(content) => println!("{}", content),
            Err(reason) => panic!(reason),
        }
    }
}

fn read_file(filenames: &Vec<String>) -> Result<String, io::Error> {
    let mut content = String::new();

    for filename in filenames {
        let mut file = File::open(filename)?;
        file.read_to_string(&mut content)?;
    }

    Ok(content)
}

Run Code Online (Sandbox Code Playgroud)

谁能解释一下我在这里缺少什么?

att*_*ona 5

Args返回的迭代器的第一个元素std::env::args通常是可执行文件的路径( 有关更多详细信息,请参阅文档)。

出现错误的原因是您没有跳过第一个参数:程序二进制文件不是有效的 UTF-8 字节序列。

明显无意义的错误thread 'main' panicked at 'Box<Any>'是因为panic!没有与format!语法的相同参数一起使用。

use std::env;
use std::fs::File;
use std::io;
use std::io::prelude::*;

fn main() {
    for filename in env::args().skip(1) {
        match read_file(filename) {
            Ok(content) => println!("{}", content),
            Err(reason) => panic!("{}", reason),
        }
    }
}

fn read_file(filename: String) -> Result<String, io::Error> {
    let mut content = String::new();

    let mut file = File::open(filename)?;
    file.read_to_string(&mut content)?;

    Ok(content)
}
Run Code Online (Sandbox Code Playgroud)