gpt4 book ai didi

rust - 处理 serde 错误和其他错误类型?

转载 作者:行者123 更新时间:2023-11-29 08:26:12 24 4
gpt4 key购买 nike

我有以下export_directory的功能。

// For handling multiple error type
type BoxResult<T> = Result<T, Box<std::error::Error>>;

fn export_directory(dir: &Directory, export_path: &str) -> BoxResult<String> {
let mut file = OpenOptions::new().write(true).truncate(true).create(true).open(export_path)?;
serde_json::to_string(dir).or_else(|err| Err(Box::new(err)))
}

fn main() {
let mut dir = Directory::new();
export_directory(&dir, "export_path.json");
}

当我编译代码时,它给了我

error[E0308]: mismatched types
--> src/main.rs:98:3
|
96 | fn export_directory(dir: &Directory, export_path: &str) -> BoxResult<String> {
| ----------------- expected `std::result::Result<std::string::String, std::boxed::Box<(dyn std::error::Error + 'static)>>` because of return type
97 | let mut file = OpenOptions::new().write(true).truncate(true).create(true).open(export_path)?;
98 | serde_json::to_string(dir).or_else(|err| Err(Box::new(err)))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait std::error::Error, found struct `serde_json::error::Error`
|
= note: expected type `std::result::Result<_, std::boxed::Box<(dyn std::error::Error + 'static)>>`
found type `std::result::Result<_, std::boxed::Box<serde_json::error::Error>>`

但是当提到serde documentation时, serde_json::error::Error 已经实现了 Error 特性。这里出了什么问题?

最佳答案

rustc 未能自动推断 Box在闭包里面想成为 Box<dyn std::error::Error>Box<serde_json::Error> .您必须告诉编译器您实际上是在创建一个装箱的特征对象而不是一个装箱的结构。

另一方面,你不能直接调用Box::<std::error::Error>::new因为Error不扩展 std::marker::Sized .

然而,一个serde_json::Error确实可以装箱成盒装std::error::Error .因此,您可以使用 as 强制进行此转换运算符(operator):

result.map_err(|err| Box::new(err) as Box<dyn std::error::Error>)

Working example on Rust Playground

关于rust - 处理 serde 错误和其他错误类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57423880/

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