如何从另一个模块实例化一个公共元组结构(带有私有字段)?

时间:2018-09-10 10:45:02

标签: struct rust

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

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

我在另一个模块中使用此结构,该模块需要在那里导入。但是,当我尝试将此结构Id实例化为:

let mut id = Id(newId.as_bytes().to_vec()); //newId is a String

它抛出一个错误:

  由于私有字段,

构造函数在此处不可见

如何将未命名字段公开(尽管我不能这样做,因为这是API的一部分)?还是有其他方法初始化此结构?

2 个答案:

答案 0 :(得分:3)

0字段是私有字段,您可以像这样将其公开

pub struct Id(pub Vec<u8>);

或者您添加像这样的显式构造函数

impl Id {
    pub fn new(param: Vec<u8>) -> Id {
        Id(param)
    }
}

并称呼它

let mut id = Id::new("newId".as_bytes().to_vec());

答案 1 :(得分:1)

如果您不想在全球范围内公开某些东西,但希望在某个模块中公开它,则可以使用visibility qualifiers。示例:

pub struct Id(pub(crate) Vec<u8>);