"-6ren"> "-对不起,我的菜鸟使用rust 问题。 我正在做一个关于基于 avrow 的 avro 文件操作工具的项目。我看到流行的编译错误发生在标题读取时。我看到 avrow_cli 工作得很好,但我不明白为什么-6ren">
gpt4 book ai didi

rust - 为什么 rustc 编译会提示我的简单代码 "the trait std::io::Read is not implemented for Result"

转载 作者:行者123 更新时间:2023-12-05 04:48:29 31 4
gpt4 key购买 nike

对不起,我的菜鸟使用rust 问题。

我正在做一个关于基于 avrow 的 avro 文件操作工具的项目。我看到流行的编译错误发生在标题读取时。我看到 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());
}
   Compiling avro-dump-schema-rs v0.1.0 (/home/shuduo/work/avro-rs)
error[E0277]: the trait bound `Result<File, std::io::Error>: std::io::Read` is not satisfied
--> src/main.rs:13:38
|
13 | let header = Header::from_reader(&mut file);
| ^^^^^^^^^ the trait `std::io::Read` is not implemented for `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<R: Read>(reader: &mut R) -> Result<Self, AvrowErr> {
| ---- required by this bound in `Header::from_reader`

error[E0599]: no method named `schema` found for enum `Result<Header, AvrowErr>` in the current scope
--> src/main.rs:14:27
|
14 | println!("{}", header.schema());
| ^^^^^^ method not found in `Result<Header, AvrowErr>`

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0277, E0599.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `avro-dump-schema-rs`

To learn more, run the command again with --verbose.

最佳答案

OpenOptions::open()返回 io::Result<File>而不仅仅是 File .你必须检查 open()在能够使用该文件之前操作已成功。

获取文件的最简单方法是调用 .unwrap().expect()结果,这将导致应用程序在情况下 panic (即崩溃)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()返回 Result你应该处理。

关于rust - 为什么 rustc 编译会提示我的简单代码 "the trait std::io::Read is not implemented for Result<File, anyhow::Error>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68057178/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com