为什么Rust编译报错Result<File, Error>未实现std::io::Read trait?
问题原因
两个报错本质都是没有处理Rust中用于错误处理的Result类型:
- 第一个E0277报错:
std::fs::OpenOptions::open操作本身可能失败(比如文件不存在、无读取权限),返回值是Result<File, std::io::Error>枚举类型,而非直接返回文件句柄。Result本身没有实现Readtrait,不能直接传给from_reader方法。 - 第二个E0599报错:
Header::from_reader方法的返回值也是Result枚举,需要先从成功的分支里取出Header实例,才能调用schema()方法。
修正代码
你可以先用unwrap()做简单的错误处理(遇到错误直接panic退出,适合调试阶段快速跑通流程),修改后代码如下:
use std::env; use avrow::Header; fn main() { let args: Vec<String> = env::args().collect(); println!("Hello, {}!", &args[1]); // 调用unwrap()取出Result中的File实例,打开失败直接panic let mut file = std::fs::OpenOptions::new() .read(true) .open(&args[1]) .unwrap(); // 同样调用unwrap()取出Result中的Header实例,解析失败直接panic let header = Header::from_reader(&mut file).unwrap(); println!("{}", header.schema()); }
如果是生产环境使用,建议替换unwrap()为match或者?运算符做更友好的错误提示,避免程序直接崩溃。
内容的提问来源于stack exchange,提问作者Shuduo
相关产品推荐
相关产品推荐

