是否可以声明一个元组结构,其中除了声明之外的所有意图和目的都是隐藏成员的?
// usize isn't public since I don't want users to manipulate it directly
struct MyStruct(usize);
// But now I can't initialize the struct using an argument to it.
let my_var = MyStruct(0xff)
// ^^^^
// How to make this work?
有没有办法让成员保持私有(private),但仍然允许使用参数初始化新结构,如上所示?
作为替代方案,可以实现诸如 MyStruct::new
之类的方法,但我仍然想知道是否可以避免在该类型上使用方法,因为它更短,并且非常适合包装单个变量的类型。
背景
无需深入了解太多细节,此类型的唯一目的是包装单个类型(隐藏一些细节、添加一些功能并在编译时完全优化掉的助手),在在这种情况下,它并没有完全暴露隐藏的内部结构以使用 Struct(value)
样式初始化。
此外,由于包装器的开销为零,因此使用通常与分配/创建而不是强制转换相关联的 new
方法有点误导。
就像输入 (int)v
或 int(v)
很方便,而不是 int::new(v)
,我我想为我自己的类型做这个。
它经常被使用,所以使用短表达式的能力非常方便。目前我正在使用调用 new
方法的宏,它可以但有点尴尬/间接,因此这个问题。
最佳答案
严格来说这在 Rust 中是不可能的。
然而,使用带有类似名称函数的普通 struct
可以实现预期的结果(是的,这行得通!)
pub struct MyStruct {
value: usize,
}
#[allow(non_snake_case)]
pub fn MyStruct(value: usize) -> MyStruct {
MyStruct { value }
}
现在,您可以编写 MyStruct(5)
但不能访问 MyStruct
的内部。
关于initialization - 是否可以声明一个元组结构,其成员是私有(private)的,除了初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40580250/