如何在 Rust 中添加另一个枚举变体而不破坏库用户?

ble*_*tin 1 enums rust

假设我的 Rust 库中的某处定义了以下枚举类型:

#[derive(Debug)]
pub enum Color {
    Red,
    Green,
    Blue,
}
Run Code Online (Sandbox Code Playgroud)

Color::Yellow当我向枚举添加第四个变体时,这是否被视为重大更改?如果这是一个重大更改(我猜是因为声明match),有没有办法向 API 用户表明这种类型将来可能会扩展?

Jon*_*der 5

是的,添加枚举变体被视为重大更改。请在此处的Rust RFC 1105 - API 演变中阅读有关它的更多信息。

您可以将该#[non_exhaustive]属性添加到枚举中,以警告用户您将来可能会使用更多变体扩展枚举,因此添加新变体不会被视为重大更改:

#[non_exhaustive]
#[derive(Debug)]
pub enum Color {
    Red,
    Green,
    Blue,
}
Run Code Online (Sandbox Code Playgroud)

这不允许导入您的枚举以非详尽地匹配它的项目。IE:

match color {
    Color::Red => (),
    Color::Green => (),
    Color::Blue => (),
}
Run Code Online (Sandbox Code Playgroud)

抛出错误,同时

match color {
    Color::Red => (),
    Color::Green => (),
    Color::Blue => (),
    _ => (),
}
Run Code Online (Sandbox Code Playgroud)

惯于。

  • 恕我直言,有时用新的枚举变体破坏用户代码比创建非详尽的枚举更好。当用户对库进行重大更新时,编译器会通知用户需要添加新匹配臂的地方。毕竟,无法错过枚举变量的处理程序是 Rust 匹配表达式的主要优点之一。 (2认同)