Rust 处理serde错误和其他错误类型?

Rust 处理serde错误和其他错误类型?,rust,Rust,我有以下功能导出目录 //用于处理多个错误类型 类型BoxResult=结果; fn导出目录(目录:&directory,导出路径:&str)->BoxResult{ 让mut file=OpenOptions::new().write(true).truncate(true).create(true).open(export_path)?; serde_json::to_string(dir).或_else(| err | err(Box::new(err))) } fn main(){ 让m

我有以下功能
导出目录

//用于处理多个错误类型
类型BoxResult=结果;
fn导出目录(目录:&directory,导出路径:&str)->BoxResult{
让mut file=OpenOptions::new().write(true).truncate(true).create(true).open(export_path)?;
serde_json::to_string(dir).或_else(| err | err(Box::new(err)))
}
fn main(){
让mut dir=Directory::new();
export_目录(&dir,“export_path.json”);
}
当我编译代码时,它会给我

错误[E0308]:类型不匹配
-->src/main.rs:98:3
|
96 | fn导出目录(目录:&directory,导出路径:&str)->BoxResult{
|--------------应为'std::result::result>`
找到类型“std::result::result”`

但是在引用时,
serde_json::error::error
已经实现了
error
特性。这里出了什么问题?

rustc无法自动推断闭包中的
想要成为
。您必须告诉编译器您实际上正在创建一个框trait对象而不是装箱结构

另一方面,您不能直接调用
Box:::new
,因为
Error
不扩展
std::marker::size

但是,装箱的
serde_json::Error
实际上是装箱的
std::Error::Error
。因此,您可以使用
as
运算符强制此转换:

result.or_else(|err| Err(Box::new(err) as Box<dyn std::error::Error>)
result.or|else(| err | err(Box::new(err)as Box)