繁体   English   中英

标准是否定义了 Result 的别名<T, dyn std::error::Error> ?

[英]Does the standard define an alias to Result<T, dyn std::error::Error>?

我知道Result aliasing idiom ,您可以在其中为自定义错误类型定义别名。 经典示例似乎是std::io::Result ,它可能返回std::io::Error

pub type Result<T> = Result<T, std::io::Error>;

尽管我编写了自定义错误类型,但通常情况下会出现一般情况,特别是在顶级函数(处理所有类型的错误)上。 我注意到我时不时地使用标准的Error特征,所以我反复写Result<T, Box<dyn std::error::Error>>

然后让我想知道:标准是否在某处定义了Result<T, Box<dyn Error>>的别名?

如果没有,是否有任何推荐的处理方法?

dyn std::error::Error是一个trait object ,可以引用任何实现Error trait 的类型。 这意味着该类型在编译时没有已知的大小; 它被称为动态大小类型

因此,类型Result<T, dyn std::error::Error>也是动态调整大小的,因为它需要能够保存任何合适的错误类型。 这意味着您不能在大多数上下文中直接使用此类型,特别是不能作为函数的返回类型,因此它不是特别有用。

您可能指的是Result<T, Box<dyn std::error::Error>> ,它将特征对象放在指针后面,因此Result类型本身具有已知大小。

标准是否定义了Result<T, std::error::Error>的别名?

Rust 语言没有由标准指定。 Rust 有一个标准库,但它不包含Result<T, Box<dyn std::error::Error>>的别名。 如果您需要这样的别名,您只需自己将其添加到您的代码中即可。

您可能还对anyhow crate感兴趣,它定义了任何实现std::error::Error错误类型都可以转换为的anyhow::Error类型,以及默认为该错误类型的anyhow::Result类型别名。 板条箱使用非常广泛,并且尽可能接近处理任意错误的“标准”方式。

作为旁注,类型别名定义

pub type Result<T> = Result<T, std::io::Error>;

您在问题中引用的内容无效,因为右侧的Result解析为当前定义的Result ,因此它是循环的。 如果要将前奏中的Result类型别名为也称为Result的别名,则需要编写

pub type Result<T> = std::result::Result<T, std::io::Error>;

反而。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM