Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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 появляется в нескольких местах: у самого struct, у каждого поля и у метода. Для каждого элемента требуется собственное объявление видимости.

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

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

// main.rs
mod player;

use player::Player;

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

statement use помещает Player в scope, поэтому вам не нужно каждый раз писать player::Player. Такой подход с конфиденциальностью по умолчанию выбран намеренно. Он побуждает вас тщательно обдумывать, какие части вашего кода should быть доступны внешнему миру.

challenge icon

Задание

Легко

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

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

  • product.rs: Define Product struct с двумя полями: name (String) и price (f64). Добавьте associated function с именем new, которая принимает name и price и возвращает новый Product. Remember пометить struct, its fields и метод как public, чтобы к ним можно было обращаться за пределами module.
  • main.rs: Declare product module, bring Product into scope с помощью use statement, затем создайте product и выведите its details.

Внимательно подумайте, где необходимо ключевое слово pub: сам struct должен быть видимым, fields должны быть доступны для чтения, а constructor method должен вызываться из main.rs.

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

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

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

Product: Laptop, Price: $999.99

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

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

// Объявить модуль 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Проверьте себя

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Rust