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

Методи та блоки реалізації

У Rust методи подібні до функцій, але вони визначаються в контексті структури (або переліку чи ознаки), а їхнім першим параметром завжди є self, який представляє екземпляр структури, до якої викликається метод.

Визначення методів з impl

Щоб визначити методи в структурі, ми використовуємо блок impl (реалізація) з назвою структури:

Rust
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // This is an instance method. It takes &self for reading.
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };

    // Call the method using dot notation
    println!("The area is: {}", rect.area());
}

Асоційовані (статичні) функції

Функції, визначені в блоці impl, які не приймають self як свій перший параметр, називаються асоційованими функціями (еквівалентно статичним методам в інших мовах).

Вони часто використовуються як конструктори для повернення нових екземплярів структури. Щоб викликати їх, використовуйте синтаксис подвійної двокрапки :::

Rust
impl Rectangle {
    // Associated function
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

fn main() {
    // Call the associated function
    let sq = Rectangle::square(10);
}

Методи, які змінюють стан: &mut self

Якщо методу потрібно змінити поля структури, він повинен оголосити свій перший параметр як &mut self. Сам екземпляр, у якому викликається метод, має бути оголошено як змінний (let mut):

Rust
impl Rectangle {
    fn double_size(&mut self) {
        self.width *= 2;
        self.height *= 2;
    }
}

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

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

Завершіть блок impl, визначивши метод area, який приймає &self і повертає u32 (множення ширини та висоти).

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

Напишіть `fn area(&self) -> u32 { self.width \* self.height }`всередині блоку`impl Rectangle`.

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

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

Визначте пов’язану з квадратом функцію всередині impl Rectangle, яка отримує розмір: u32 і повертає екземпляр Rectangle із шириною та висотою, рівними розміру.

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

Напишіть `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`всередині блоку`impl`.

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

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

Додайте метод зміни масштабу до Rectangle всередині блоку impl. Метод масштабування має приймати змінне посилання на self (&mut self) і фактор: параметр u32 і множити ширину та висоту Rectangle на коефіцієнт.

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

Застосуйте `fn scale(&mut self, factor: u32)`, щоб оновити`self.width`і`self.height` шляхом множення їх на`factor`.

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