G.TYP.ENM.02 不应自行创建空枚举

【级别】 建议

【描述】

在 Rust 中 只有 never 类型(!)才是唯一合法表达 无法被实例化类型 的类型。但目前 never 类型还未稳定,只能在 Nightly 下使用。

【反例】


#![allow(unused)]
#![feature(never_type)] // 当启用该功能的时候,下面的clippy才会生效
#![warn(clippy::empty_enum)]

fn main() {
// 不符合
enum Test {}
}

【正例】

所以,如果想在稳定版 Rust 中使用,建议使用std::convert::InfallibleInfallible 枚举是一个合法的空枚举,常用于错误处理中,表示永远不可能出现的错误。但是目前也可以用于在稳定版中替代 never 类型。


#![allow(unused)]
#![feature(never_type)] // 当启用该功能的时候,下面的clippy才会生效
#![warn(clippy::empty_enum)]

fn main() {
//符合: 未来 never 类型稳定的话,将会把 Infallible 设置为 never 类型的别名
pub type Infallible = !;
}

【例外】

因为 std::convert::Infallible 默认实现了很多 trait,如果不想依赖其他 trait ,那么可以用 空枚举。


#![allow(unused)]
#![feature(never_type)] // 当启用该功能的时候,下面的clippy才会生效
#![allow(clippy::empty_enum)]
fn main() {
pub enum NoUserError {}

impl Display for NoUserError {
    fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
        match *self {}
    }
}

}

【Lint 检测】

lint nameClippy 可检测Rustc 可检测Lint Grouplevel
empty_enumyesnopedanticallow