我有类似的东西:
mod private {
// My crate
pub struct A;
impl A {
pub fn new() -> Self {
Self
}
// ...
}
}
fn main() {
// External code
let obj = private::A::new();
let obj2 = private::A;
}
现在,A
不需要存储任何内部状态来执行我想要的操作(它只是用作枚举中的占位符),因此我将其设为零大小的结构。但是,这将来可能会改变,所以我想防止此板条箱之外的代码实例化A
不经过A::new()
(即实例化obj2
in main()
按目前的情况应该会失败)。
本质上,我想要与添加私有字段相同的效果A
,但我希望它保持零大小。
目前,我正在考虑这样的事情:
pub struct A {
empty: (),
}
Or this:
pub struct A(());
但是,我不确定哪种方式最惯用。
对此没有既定的习语。我会使用元组结构版本:
pub struct A(());
由于该字段是私有的,因此该模块之外的任何人都无法构造A
.
这是用的标准库内部 https://github.com/rust-lang/rust/blob/1.47.0/library/std/src/sys/unix/stdio.rs#L5-L7:
pub struct Stdin(());
pub struct Stdout(());
pub struct Stderr(());
标准库also使用命名字段版本 https://github.com/rust-lang/rust/blob/1.47.0/library/std/src/io/util.rs#L79-L81:
pub struct Empty {
_priv: (),
}
您可以使用任何零大小的类型(例如零长度数组或PhantomData https://doc.rust-lang.org/std/marker/struct.PhantomData.html), but ()
是最简单的。
也可以看看:
- 为什么要定义一个具有单位类型的单个私有字段的结构体? https://stackoverflow.com/q/63338208/155423
- 定义指向 C 不透明指针的字段的 Rust 习惯用法是什么? https://stackoverflow.com/q/38315383/155423
- 创建零大小结构体的多种方法之间有什么区别? https://stackoverflow.com/q/50162597/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)