Введение в блоки реализации
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 1 из 61.
В Rust структуры определяют, какие данные содержит тип, но они не определяют, что этот тип может делать. Чтобы наделить структуру поведением, мы используем блоки реализации с ключевым словом impl.
Блок реализации связывает функции (называемые методами) с конкретной структурой. Вот базовая структура:
struct Dog {
name: String,
age: u8,
}
impl Dog {
fn bark(&self) {
println!("{} says woof!", self.name);
}
}
Блок impl Dog сообщает Rust, что всё внутри него относится к структуре Dog. Такое разделение позволяет сохранять определение данных чистым, в то же время позволяя добавлять столько методов, сколько необходимо, в блоке реализации.
Чтобы вызвать метод, используйте точечную нотацию для экземпляра:
fn main() {
let my_dog = Dog {
name: String::from("Rex"),
age: 3,
};
my_dog.bark(); // Вывод: Rex says woof!
}
Этот паттерн разделения данных (struct) и поведения (блок impl) является фундаментальным для организации кода на Rust. В следующих уроках мы изучим, как методы получают доступ к данным структуры через параметр &self, который вы видите в примере выше.
Задание
ЛегкоСоздайте структуру Cat с двумя полями: name (String) и lives (u8).
Добавьте блок реализации для Cat с методом под названием meow, который принимает &self и выводит имя кошки, за которым следует " says meow!".
Вы получите два входных значения:
- Первая строка: имя кошки (String)
- Вторая строка: количество жизней (u8)
Создайте экземпляр Cat с предоставленными значениями и вызовите у него метод meow.
Ожидаемый формат вывода:
{name} says meow!Шпаргалка
Блоки реализации связывают методы со структурами с помощью ключевого слова impl:
struct Dog {
name: String,
age: u8,
}
impl Dog {
fn bark(&self) {
println!("{} says woof!", self.name);
}
}
Блок impl отделяет определение данных (структуру) от поведения (методов). Методы вызываются с использованием точечной нотации:
let my_dog = Dog {
name: String::from("Rex"),
age: 3,
};
my_dog.bark(); // Вывод: Rex says woof!
Методы используют параметр &self для доступа к данным структуры.
Попробуйте сами
use std::io;
// TODO: Определите структуру Cat с полями 'name' (String) и 'lives' (u8)
// TODO: Добавьте блок реализации для Cat с методом 'meow'
fn main() {
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut lives_input = String::new();
io::stdin().read_line(&mut lives_input).expect("Failed to read line");
let lives: u8 = lives_input.trim().parse().expect("Failed to parse lives");
// TODO: Создайте экземпляр Cat и вызовите метод meow
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player