如何在 Rust 中禁用结构体的构造但保留模式匹配呢?
让我们看一个例子:
struct OrderedPair(pub u32, pub u32);
impl OrderedPair {
fn new(a: u32, b: u32) -> Self {
if a < b {
Self(a, b)
} else {
Self(b, a)
}
}
}
显然,我希望抑制这种结构(例如OrderedPair(2, 1)
)的构建,并且仅使用new
方法,以保留不变性质。我知道3种实现方式:
- 将字段设为私有
struct OrderedPair(u32, u32);
- 添加一个私有的虚拟字段
struct OrderedPair(pub u32, pub u32, ());
让结构体变得不完整
#[non_exhaustive]
struct OrderedPair(pub u32, pub u32);
问题是,如果只使用1,则完全无法访问成员,而如果使用全部三个,则无法使用模式匹配。
let OrderedPair(min, max) = my_ordered_pair;
有没有一种方法可以阻止结构体构造,但允许模式匹配?
我知道,如果我们声明一个该类型的可变变量,并且对成员具有公共访问权限,则不变性可以通过手动更改成员来打破,但是现在避免结构体构造函数就足够了。