0Pricing
Learn Rust Coding · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Модули и mod
  2. pub и видимость
  3. use и пути
  4. Крейты и корень крейта
← Назад к Learn Rust Coding