Нет, вы не можете создать эту структуру из инициализации члена, и поэтому ваш вопрос уже является ответом.
Это потому, что члены по умолчанию являются частными и не могут использоваться напрямую.Только непосредственный модуль и его подмодули могут получить доступ к закрытым полям, функциям, ... (см. книгу о видимости ).
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
напрямую.