为什么 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
。
抱歉我的菜鸟生锈问题。
我正在做一个关于基于 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_readerHeader::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
。