有没有与结果相反的惯用语<无懈可击>?



当想要显示返回Result的性状永远不会失败时,Infallible被用作错误类型,如下例所示:

trait Foo {
type T;
type E: std::error::Error;
fn bar() -> Result<Self::T, Self::E>;
}
impl Foo for () {
type T = ();
type E = std::convert::Infallible;
fn bar() -> Result<Self::T, Self::E> { Ok(()) }
}

但是对于总是返回Err而永远不返回Ok的实现应该怎么做?有没有习惯的方法来填补下面的空白?

impl Foo for MyCustomError {
type T = //what to put here as "never returned type";
type E = MyCustomError;
fn bar() -> Result<Self::T, Self::E> { Err(MyCustomError) }
}

一旦不稳定,就可以使用

#![feature(never)]
impl Foo for MyCustomError {
type T = !;
type E = MyCustomError;
fn bar() -> Result<Self::T, Self::E> { Err(MyCustomError) }
}
在此之前,我们可以构造自己的空enum:
enum Void {}
impl Foo for MyCustomError {
type T = Void;
type E = MyCustomError;
fn bar() -> Result<Self::T, Self::E> { Err(MyCustomError) }
}

由于显而易见的原因无法构造,Rust也会看到并相应地进行优化。或者使用void::VoidInfallible,除了不同的特征,每个工具本质上是相同的。

相关内容

最新更新