当想要显示返回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::Void
或Infallible
,除了不同的特征,每个工具本质上是相同的。