«главная» тема запаниковала в «Box <Any>» - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь выучить 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

это моя программа:

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)
}

Может кто-нибудь объяснить чего мне здесь не хватает?

1 Ответ

4 голосов
/ 12 марта 2020

Первый элемент итератора 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...