Модульні уроки (2/2)
Риси та межі рис
Риси визначають поведінку, яку має певний тип і може поділитися з іншими типами. Ми можемо використовувати ознаки для визначення набору методів, які представляють певну загальну функціональність або інтерфейс, подібний до інтерфейсів в інших мовах програмування.
Обмеження характеристик дозволяють нам вказати, що загальний тип повинен реалізовувати певну ознаку, забезпечуючи доступність необхідних методів під час компіляції.
Визначення та впровадження ознаки
Щоб визначити властивість, ми використовуємо ключове слово trait, за яким слідують сигнатури методів, які мають визначати типи реалізації:
pub trait Summary {
fn summarize(&self) -> String;
}Щоб реалізувати трейт для конкретного типу, ми використовуємо синтаксис impl TraitName for TypeName:
pub struct NewsArticle {
pub headline: String,
pub content: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}", self.headline)
}
}Межі ознак
Під час написання загальних функцій ми можемо обмежити параметри типу, щоб гарантувати, що вони реалізують певну рису. Стандартний синтаксис <T: Trait>:
pub fn notify<T: Summary>(item: &T) {
println!("Notification: {}", item.summarize());
}Крім того, для більш складних підписів ми можемо використовувати пункт where:
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notification: {}", item.summarize());
}Спробуйте самі
Вправа 1: Підсумкова риса
Визначте ознаку під назвою Summary, яка містить сигнатуру методу fn summarize(&self) -> String;. Далі визначте структуру NewsArticle із полем заголовка типу String і реалізуйте для нього ознаку Summary, щоб метод summarize повертав значення поля заголовка.
Показати підказку
Визначте атрибут `Summary`і структуру`NewsArticle`. Реалізуйте за допомогою`impl Summary for NewsArticle`клонування поля`self.headline.clone()`.
Рішення доступне після 3 спроб
Вправа 2: межі ознак із print_summary
На основі коду з попередньої вправи визначте загальну функцію під назвою print_summary<T>, яка приймає елемент параметра типу &T. Застосуйте прив’язку ознаки, щоб T мав реалізувати ознаку Summary. Усередині функції виведіть результат, який повертає item.summarize().
Показати підказку
Використовуйте підпис `fn print_summary<T: Summary>(item: &T)`і викликайте`item.summarize()`всередині`println!`.
Рішення доступне після 3 спроб
Вправа 3: Обчислення площі за ознаками
Визначте ознаку під назвою Area за допомогою методу fn area(&self) -> f64;. Створіть структуру Circle, що містить поле радіуса типу f64, і реалізуйте для нього ознаку Area, обчисливши площу (формула: радіус * радіус * 3,14159).
Показати підказку
Визначте рису `Площа`і структуру`Коло`. Застосуйте "area(&self)" за допомогою формули площі кола.
Рішення доступне після 3 спроб