pub и видимость
Управление доступом
«pub и видимость» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
По умолчанию доступ закрыт
В Rust всё внутри модуля по умолчанию является закрытым. Другие модули не могут это видеть, если вы явно не разрешите доступ с помощью pub.
Это безопасное поведение по умолчанию скрывает детали реализации, пока вы намеренно не откроете их.
Функции pub
Пометка функции как pub делает её вызываемой из-за пределов модуля. Без неё вызов не пройдёт компиляцию.
mod math {
pub fn square(x: i32) -> i32 {
x * x
}
}
fn main() {
println!("{}", math::square(5));
}Закрытые вспомогательные элементы остаются скрытыми
Вы можете оставить внутренние вспомогательные элементы закрытыми, открыв общедоступный программный интерфейс. Общедоступная функция может вызывать закрытую, но внешний код — нет.
mod math {
fn double(x: i32) -> i32 { x * 2 }
pub fn quadruple(x: i32) -> i32 { double(double(x)) }
}
fn main() {
println!("{}", math::quadruple(3));
}pub-структуры скрывают поля
Пометка структуры как pub открывает сам тип, но его поля остаются закрытыми, если каждое из них также не помечено как pub.
Это позволяет управлять созданием и изменением структуры.
mod model {
pub struct User {
pub name: String,
age: u32,
}
impl User {
pub fn new(name: String, age: u32) -> User {
User { name, age }
}
pub fn age(&self) -> u32 { self.age }
}
}
fn main() {
let u = model::User::new(String::from("Sam"), 28);
println!("{} is {}", u.name, u.age());
}Зачем скрывать поля
Закрытые поля обеспечивают соблюдение инвариантов. Вызывающий код должен использовать ваш конструктор и методы, поэтому вы можете проверять входные данные и позднее менять внутреннее устройство без нарушения работы пользовательского кода.
pub-перечисления открывают всё
В отличие от структур, перечисление с pub автоматически делает общедоступными все свои варианты. У вариантов нет отдельной видимости.
mod traffic {
pub enum Light {
Red,
Yellow,
Green,
}
}
fn main() {
let l = traffic::Light::Green;
let go = matches!(l, traffic::Light::Green);
println!("go = {}", go);
}pub(crate): доступ во всём пакете
pub(crate) делает элемент видимым везде внутри того же пакета, но не в сторонних пакетах, которые зависят от вашего.
Это идеально подходит для внутренних программных интерфейсов, общих для нескольких модулей.
mod config {
pub(crate) fn default_port() -> u16 {
8080
}
}
fn main() {
println!("{}", config::default_port());
}pub(super): только для родителя
pub(super) открывает элемент только родительскому модулю. Это более узкое разрешение, чем полный pub.
mod outer {
pub fn run() {
inner::helper();
}
mod inner {
pub(super) fn helper() {
println!("visible to parent only");
}
}
}
fn main() {
outer::run();
}Повторный экспорт с помощью pub use
pub use повторно экспортирует элемент, позволяя обращаться к нему по более короткому или удобному пути. Так формируется чистый общедоступный программный интерфейс.
mod deep {
pub mod nested {
pub fn ping() {
println!("pong");
}
}
pub use nested::ping;
}
fn main() {
deep::ping();
}Проектирование общедоступного программного интерфейса
Открывайте только минимальную часть, необходимую для работы. Оставляйте вспомогательные элементы закрытыми, скрывайте поля структур за методами и используйте pub(crate) для внутреннего доступа.
Компактный программный интерфейс проще развивать, не нарушая работу пользовательского кода.
Итоги уровней видимости
От наиболее ограниченного к наименее ограниченному:
- по умолчанию (закрыт для модуля)
pub(super)— видим родительскому модулюpub(crate)— видим во всём пакетеpub— видим везде
Быстрая проверка
Проверьте, насколько хорошо вы понимаете видимость.
Итоги
Вы научились управлять доступом:
- Элементы по умолчанию закрыты;
pubоткрывает к ним доступ - У
pub-структур поля остаются закрытыми, если каждое из них не помечено какpub pub-перечисления открывают все вариантыpub(crate)иpub(super)обеспечивают более точный контрольpub useповторно экспортирует элементы, помогая сформировать чистый программный интерфейс
Часто задаваемые вопросы
Урок «pub и видимость» бесплатный?
Да — полный текст урока «pub и видимость» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «pub и видимость»?
Управление доступом Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «pub и видимость»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Модули и mod
- pub и видимость
- use и пути
- Крейты и корень крейта