是否可以声明除初始化外其成员为私有的元组结构?

ide*_*n42 4 visibility initialization declaration rust

是否可以声明一个元组结构,其中除声明外,出于所有意图和目的隐藏成员?

// 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?
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以使成员保持私有状态,但仍然允许使用上面的参数初始化新结构?

作为一种替代方法,MyStruct::new可以实现诸如之类的方法,但是我仍然想知道是否有可能避免在类型上使用方法,因为它更短,并且对于包装单个变量的类型来说很好。


背景

无需过多讨论细节,此类型的唯一目的是包装单个类型(隐藏一些细节,添加一些功能并在编译时进行完全优化的帮助器),在这种情况下,它并没有完全暴露出要使用的隐藏内部结构在Struct(value)风格初始化。此外,由于包装器的开销为零,因此使用new通常与分配/创建而不是强制转换相关联的方法会产生一些误导。

就像它是方便键入(int)vint(v),而不是int::new(v)一样,我想针对自己的类型进行此操作。

它经常使用,因此使用短表达式的功能非常方便。当前,我正在使用一个宏,该宏调用一个new方法,它的方法还可以,但是有点尴尬/间接,因此这个问题出现了。

小智 6

严格来说,这在Rust中是不可能的。

但是,可以使用struct具有类似功能的法线来实现所需的结果(是的,这可行!)

pub struct MyStruct {
    value: usize,
}

#[allow(non_snake_case)]
pub fn MyStruct(value: usize) -> MyStruct {
    MyStruct { value: value }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以编写MyStruct(5)但不能访问的内部信息MyStruct