Перейти к основному содержимому
Модуль 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. Метод масштабирования должен принимать изменяемую ссылку на себя (&mut self) и параметр Factor: u32 и умножать ширину и высоту Rectangle на коэффициент.

Загрузка редактора…
Показать подсказку

Реализуйте `fn Scale(&mut self, Factor: u32), чтобы обновить `self.width` и `self.height`, умножив их на `factor`.

Решение доступно после 3 попыток