Как создать общедоступную структуру кортежа (с закрытым полем) из другого модуля? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть модуль, где структура кортежа определяется как:

#[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 голосов
/ 10 сентября 2018

Если вы не хотите публиковать что-либо во всем мире, но хотите сделать это видимым в определенном модуле, вы можете использовать определителей видимости . Пример:

pub struct Id(pub(crate) Vec<u8>);
0 голосов
/ 10 сентября 2018

Поле 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...