为什么 rustc compile 抱怨我的简单代码 "the trait std::io::Read is not implemented for Result<File, anyhow::Error>"

why rustc compile complain my simple code "the trait std::io::Read is not implemented for Result<File, anyhow::Error>"

抱歉我的菜鸟生锈问题。

我正在做一个关于基于 avrow 的 avro 文件操作工具的项目。我看到流行的编译错误发生在 header 阅读。我看到 avrow_cli 效果很好,但我不明白为什么 avrow_cli 处理得那么好。有人可以指出什么是错的吗?谢谢。

下面是一段代码和错误信息。

use std::env;
use avrow::Header;

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

    println!("Hello, {}!", &args[1]);

    let mut file = std::fs::OpenOptions::new()
        .read(true)
        .open(&args[1]);

    let header = Header::from_reader(&mut file);
    println!("{}", header.schema());
}

正在编译 avro-dump-schema-rs v0.1.0 (/home/shuduo/work/avro-rs) error[E0277]: trait bound Result<File, std::io::Error>: std::io::Read 不满足 --> src/main.rs:13:38 | 13 |让 header = Header::from_reader(&mut 文件); | ^^^^^^^^^ 特征 std::io::Read 没有为 Result<File, std::io::Error> 实现 | ::: /home/shuduo/.cargo/registry/src/github.com-1ecc6299db9ec823/avrow-0.2.1/src/reader.rs:638:27 | 638 | pub fn from_reader(reader: &mut R) -> 结果 { | ---- 此绑定要求 Header::from_reader

错误[E0599]:在当前范围内找不到枚举 Result<Header, AvrowErr> 的名为 schema 的方法 --> src/main.rs:14:27 | 14 | println!("{}", header.schema()); | ^^^^^^ 方法未在 Result<Header, AvrowErr>

中找到

错误:由于之前的 2 个错误而中止

部分错误有详细解释:E0277、E0599。 有关错误的更多信息,请尝试 rustc --explain E0277。 错误:无法编译 avro-dump-schema-rs

要了解更多信息,请使用 --verbose 再次 运行 命令。

OpenOptions::open() returns 一个 io::Result<File> 而不是 File。在能够使用该文件之前,您必须检查 open() 操作是否成功。

获取文件的最简单方法是对结果调用 .unwrap().expect(),如果 open() 返回一个错误

 let mut file = std::fs::OpenOptions::new()
        .read(true)
        .open(&args[1])
        .expect(&format!("Failed to open {}", args[1]));

或者你可以尝试优雅地处理错误:

let result = std::fs::OpenOptions::new()
        .read(true)
        .open(&args[1]);

    // you can use `match` to extract the OK/Err cases
    match result{
        Ok(mut file) => {
            let header = Header::from_reader(&mut file);
            println!("{}", header.schema());
        }

        Err(e) => {
            // handle the error
        }
    }

    // or you can use `if let` if you are interested only in one of the enum variants (OK or Err)
    if let Ok(file) = result{
        let header = Header::from_reader(&mut file);
        println!("{}", header.schema());
    }
   

同样适用于您的第二条错误消息 - from_reader() returns 您应该处理的 Result