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::Infallible
。 Infallible
枚举是一个合法的空枚举,常用于错误处理中,表示永远不可能出现的错误。但是目前也可以用于在稳定版中替代 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 name | Clippy 可检测 | Rustc 可检测 | Lint Group | level |
---|---|---|---|---|
empty_enum | yes | no | pedantic | allow |