initialization - 是否可以声明一个元组结构,其成员是私有(private)的,除了初始化?

标签 initialization rust visibility declaration

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

// 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)vint(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/

相关文章:

java - Sonarqube 给出了 HashMap 初始化代码合规问题

arrays - Rust 0.13 中的大固定大小数组的堆栈溢出

c# - 如何在自定义 wpf 控件上绑定(bind)数据网格列的可见性?

c++ - 如何在 C++ 中初始化一个零数组

c++ - 多维 vector 初始化

c++ - 访问成员变量的问题

c++ - (Rust 题) C++ 双指针指向 void 的含义

multithreading - 在 Rust 中,线程中使用的所有内容都必须是 `Send` 吗?

css - 隐藏在 li 中的可见性

css - 将鼠标悬停在文本上以使用 CSS 在另一个 div(不是子元素)中显示图像