Ключевое слово 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 быть доступны внешнему миру.
Задание
ЛегкоДавайте создадим простой каталог продуктов, организовав код в двух файлах и сделав нужные элементы публичными, чтобы их можно было использовать из вашей основной программы.
Вы создадите два файла:
product.rs: DefineProductstruct с двумя полями:name(String) иprice(f64). Добавьте associated function с именемnew, которая принимает name и price и возвращает новыйProduct. Remember пометить struct, its fields и метод как public, чтобы к ним можно было обращаться за пределами module.main.rs: Declare product module, bringProductinto scope с помощьюusestatement, затем создайте 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}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust