Rust 禁用结构构造
Rust disable struct construction
如何在 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;
那么有没有办法阻止结构构造但允许模式匹配?
我知道如果我们声明一个具有 public 成员访问权限的可变变量类型,那么可以通过手动更改成员来破坏不变量,但现在避免结构构造函数就足够了。
您可以在返回的元组上执行模式匹配,而不是直接在字段上执行模式匹配:
#[derive(Clone, Copy)]
pub struct OrderedPair {
a: u32,
b: u32,
}
impl OrderedPair {
pub fn new(a: u32, b: u32) -> Self {
let (a, b) = if a < b { (a, b) } else { (b, a) };
Self { a, b }
}
pub fn content(self) -> (u32, u32) {
(self.a, self.b)
}
}
如何在 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;
那么有没有办法阻止结构构造但允许模式匹配?
我知道如果我们声明一个具有 public 成员访问权限的可变变量类型,那么可以通过手动更改成员来破坏不变量,但现在避免结构构造函数就足够了。
您可以在返回的元组上执行模式匹配,而不是直接在字段上执行模式匹配:
#[derive(Clone, Copy)]
pub struct OrderedPair {
a: u32,
b: u32,
}
impl OrderedPair {
pub fn new(a: u32, b: u32) -> Self {
let (a, b) = if a < b { (a, b) } else { (b, a) };
Self { a, b }
}
pub fn content(self) -> (u32, u32) {
(self.a, self.b)
}
}