Перейти до основного вмісту
Модуль 5 · Урок 2 із 210/14 у курсі~15 min
Модульні уроки (2/2)

Риси та межі рис

Риси визначають поведінку, яку має певний тип і може поділитися з іншими типами. Ми можемо використовувати ознаки для визначення набору методів, які представляють певну загальну функціональність або інтерфейс, подібний до інтерфейсів в інших мовах програмування.

Обмеження характеристик дозволяють нам вказати, що загальний тип повинен реалізовувати певну ознаку, забезпечуючи доступність необхідних методів під час компіляції.


Визначення та впровадження ознаки

Щоб визначити властивість, ми використовуємо ключове слово trait, за яким слідують сигнатури методів, які мають визначати типи реалізації:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

Щоб реалізувати трейт для конкретного типу, ми використовуємо синтаксис impl TraitName for TypeName:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

Межі ознак

Під час написання загальних функцій ми можемо обмежити параметри типу, щоб гарантувати, що вони реалізують певну рису. Стандартний синтаксис <T: Trait>:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

Крім того, для більш складних підписів ми можемо використовувати пункт where:

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

Спробуйте самі

Вправа 1: Підсумкова риса

вправи#rust.m5.l2.e1
Спроби: 0Завантаження…

Визначте ознаку під назвою Summary, яка містить сигнатуру методу fn summarize(&self) -> String;. Далі визначте структуру NewsArticle із полем заголовка типу String і реалізуйте для нього ознаку Summary, щоб метод summarize повертав значення поля заголовка.

Завантаження редактора…
Показати підказку

Визначте атрибут `Summary`і структуру`NewsArticle`. Реалізуйте за допомогою`impl Summary for NewsArticle`клонування поля`self.headline.clone()`.

Рішення доступне після 3 спроб

Вправа 2: межі ознак із print_summary

вправи#rust.m5.l2.e2
Спроби: 0Завантаження…

На основі коду з попередньої вправи визначте загальну функцію під назвою print_summary<T>, яка приймає елемент параметра типу &T. Застосуйте прив’язку ознаки, щоб T мав реалізувати ознаку Summary. Усередині функції виведіть результат, який повертає item.summarize().

Завантаження редактора…
Показати підказку

Використовуйте підпис `fn print_summary<T: Summary>(item: &T)`і викликайте`item.summarize()`всередині`println!`.

Рішення доступне після 3 спроб

Вправа 3: Обчислення площі за ознаками

вправи#rust.m5.l2.e3
Спроби: 0Завантаження…

Визначте ознаку під назвою Area за допомогою методу fn area(&self) -> f64;. Створіть структуру Circle, що містить поле радіуса типу f64, і реалізуйте для нього ознаку Area, обчисливши площу (формула: радіус * радіус * 3,14159).

Завантаження редактора…
Показати підказку

Визначте рису `Площа`і структуру`Коло`. Застосуйте "area(&self)" за допомогою формули площі кола.

Рішення доступне після 3 спроб