Как ограничить построение структуры? - PullRequest
0 голосов
/ 03 декабря 2018

Можно ли запретить создание экземпляров непосредственно из инициализации члена?

например,

pub struct Person {
    name: String,
    age: u8,
}

impl Person {
    pub fn new(age: u8, name: String) -> Person {
        if age < 18 {
            panic!("Can not create instance");
        }
        Person { age, name }
    }
}

Я все еще могу использовать Person {age: 6, name:String::from("mike")} для создания экземпляра.Есть ли способ избежать этого?

1 Ответ

0 голосов
/ 03 декабря 2018

Нет, вы не можете создать эту структуру из инициализации члена, и поэтому ваш вопрос уже является ответом.

Это потому, что члены по умолчанию являются частными и не могут использоваться напрямую.Только непосредственный модуль и его подмодули могут получить доступ к закрытым полям, функциям, ... (см. книгу о видимости ).

mod foo {
    pub struct Person {
        name: String,
        age: u8,
    }

    impl Person {
        pub fn new(age: u8, name: String) -> Person {
            if age < 18 {
                panic!("Can not create instance");
            }
            Person { age, name }
        }
    }
}

use foo::Person; // imagine foo is an external crate

fn main() {
    let p = Person {
        name: String::from("Peter"),
        age: 8,
    };
}
error[E0451]: field `name` of struct `Foo::Person` is private
error[E0451]: field `age` of struct `Foo::Person` is private

С другой стороны, если выЧтобы сделать возможным создание экземпляра путем инициализации члена, используйте ключевое слово pub перед всеми членами.

pub struct Person {
    pub name: String,
    pub age: u8,
}

Иногда полезно предоставить пользователю вашего ящика доступ к членам напрямую, новы хотите ограничить создание экземпляра вашими "конструкторами".Просто добавьте личное поле.

pub struct Person {
    pub name: String,
    pub age: u8,
    _private: ()
}

Поскольку вы не можете получить доступ к _private, вы не можете создать экземпляр Person напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...