Ключевое слово 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 каждый раз. Этот подход «приватность по умолчанию» является намеренным — он побуждает вас тщательно обдумывать, какие части вашего кода должны быть открыты для внешнего мира.
Задание
ЛегкоДавайте создадим простой каталог товаров, организовав код в двух файлах и сделав нужные элементы публичными, чтобы их можно было использовать в основной программе.
Вы создадите два файла:
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}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player