Уроки модуля (2/2)
Методы и блоки реализации
В Rust методы похожи на функции, но они определяются в контексте структуры (или перечисления или типажа), и их первым параметром всегда является self, который представляет экземпляр структуры, для которой вызывается метод.
Определение методов с помощью impl
Чтобы определить методы в структуре, мы используем блок impl (реализация) с именем структуры:
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 в качестве первого параметра, называются связанными функциями (эквивалентно статическим методам в других языках).
Они часто используются в качестве конструкторов для возврата новых экземпляров структуры. Чтобы вызвать их, используйте синтаксис :: с двойным двоеточием:
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):
impl Rectangle {
fn double_size(&mut self) {
self.width *= 2;
self.height *= 2;
}
}Попробуйте сами
Завершите блок impl, определив метод area, который принимает &self и возвращает u32 (перемножение ширины и высоты).
Показать подсказку
Напишите `fn area(&self) -> u32 { self.width \* self.height }`внутри блока`impl Rectangle`.
Решение доступно после 3 попыток
Определите связанную с квадратом функцию внутри impl Rectangle, которая получает размер: u32 и возвращает экземпляр Rectangle с шириной и высотой, равными размеру.
Показать подсказку
Напишите `fn Square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`внутри блока`impl`.
Решение доступно после 3 попыток
Добавьте метод мутатора масштаба в Rectangle внутри блока impl. Метод масштабирования должен принимать изменяемую ссылку на себя (&mut self) и параметр Factor: u32 и умножать ширину и высоту Rectangle на коэффициент.
Показать подсказку
Реализуйте `fn Scale(&mut self, Factor: u32), чтобы обновить `self.width` и `self.height`, умножив их на `factor`.
Решение доступно после 3 попыток