Menu
Coddy logo textTech

Ключевое слово Public

Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 9 из 61.

В предыдущем уроке вы узнали, как организовывать код в отдельные файлы модулей. Однако, если бы вы попытались использовать структуру Player из main.rs, вы бы столкнулись с ошибкой компиляции. Это происходит потому, что в Rust всё внутри модуля является приватным по умолчанию.

Чтобы сделать элементы доступными за пределами их модуля, вы должны явно пометить их ключевым словом pub:

// player.rs
pub struct Player {
    pub name: String,
    pub score: u32,
}

impl Player {
    pub fn new(name: String) -> Player {
        Player { name, score: 0 }
    }
}

Обратите внимание, как pub появляется в нескольких местах — в самой структуре, в каждом поле и в методе. Каждому элементу требуется собственное объявление видимости.

Без pub у структуры другие файлы даже не смогут обратиться к типу по имени. Без pub у полей они не смогут получить прямой доступ к данным. Без pub у методов они не смогут их вызывать.

Теперь в main.rs вы можете использовать публичные элементы модуля:

// main.rs
mod player;

use player::Player;

fn main() {
    let p = Player::new(String::from("Alice"));
    println!("{}", p.name);
}

Инструкция use вводит Player в область видимости, чтобы вам не приходилось писать player::Player каждый раз. Этот подход «приватность по умолчанию» является намеренным — он побуждает вас тщательно обдумывать, какие части вашего кода должны быть открыты для внешнего мира.

challenge icon

Задание

Легко

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

Вы создадите два файла:

  • product.rs: Определите структуру Product с двумя полями: name (String) и price (f64). Добавьте ассоциированную функцию с именем new, которая принимает имя и цену и возвращает новый Product. Не забудьте пометить структуру, её поля и метод как публичные, чтобы к ним можно было обращаться извне модуля.
  • main.rs: Объявите модуль product, импортируйте Product в область видимости с помощью оператора use, затем создайте продукт и выведите его данные.

Тщательно подумайте, где вам понадобится ключевое слово pub — сама структура должна быть видимой, поля должны быть доступны для чтения, а метод-конструктор должен быть вызываемым из main.rs.

Ваш вывод должен соответствовать следующему формату:

Product: {name}, Price: ${price}

Например, если вы создадите продукт с именем "Laptop" и ценой 999.99, вывод будет следующим:

Product: Laptop, Price: $999.99

Вы получите два входных значения: название продукта и цену.

Шпаргалка

В Rust всё в модуле является приватным по умолчанию. Чтобы сделать элементы доступными за пределами их модуля, используйте ключевое слово pub.

Помечайте структуры, поля и методы как публичные:

// player.rs
pub struct Player {
    pub name: String,
    pub score: u32,
}

impl Player {
    pub fn new(name: String) -> Player {
        Player { name, score: 0 }
    }
}

Каждому элементу требуется собственное объявление видимости:

  • pub у структуры делает тип видимым
  • pub у полей разрешает прямой доступ к данным
  • pub у методов позволяет их вызывать

Используйте инструкцию use, чтобы импортировать элементы в область видимости:

// main.rs
mod player;

use player::Player;

fn main() {
    let p = Player::new(String::from("Alice"));
    println!("{}", p.name);
}

Попробуйте сами

// Объявите модуль product
mod product;

// TODO: Введите Product в область видимости с помощью оператора use

fn main() {
    // Считайте ввод
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");
    
    // TODO: Создайте новый Product, используя функцию Product::new
    
    // TODO: Выведите информацию о продукте в формате:
    // Product: {name}, Price: ${price}
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming