如何从不同的模块实例化公共元组结构(带有私有字段)?

Raj*_*jan 5 struct rust

我有一个模块,其中元组结构定义为:

#[derive(Clone, Default, Eq, Hash, PartialEq, PartialOrd)]
pub struct Id(Vec<u8>);
Run Code Online (Sandbox Code Playgroud)

我在另一个需要导入的模块中使用了这个结构。但是当我尝试将这个结构实例Id化为:

let mut id = Id(newId.as_bytes().to_vec()); //newId is a String
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误说:

由于私有字段,构造函数在此处不可见

如何公开未命名的字段(尽管在我的情况下不能公开,因为这是 API 的一部分)?还是有不同的方法来初始化这个结构?

fil*_*mor 9

该字段0是私有的,您可以像这样公开它

pub struct Id(pub Vec<u8>);
Run Code Online (Sandbox Code Playgroud)

或者你添加一个像这样的显式构造函数

impl Id {
    pub fn new(param: Vec<u8>) -> Id {
        Id(param)
    }
}
Run Code Online (Sandbox Code Playgroud)

并称之为

let mut id = Id::new("newId".as_bytes().to_vec());
Run Code Online (Sandbox Code Playgroud)

  • 不在安全代码中,不。如果 API 决定您不应该访问该值并且不提供单独的构造函数,就是这样。 (3认同)

Mas*_*ara 7

如果您不想向全世界公开某些内容,但希望使其在某个模块中可见,则可以使用可见性限定符。例子:

pub struct Id(pub(crate) Vec<u8>);
Run Code Online (Sandbox Code Playgroud)