Модульні уроки (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. Метод масштабування має приймати змінне посилання на self (&mut self) і фактор: параметр u32 і множити ширину та висоту Rectangle на коефіцієнт.
Показати підказку
Застосуйте `fn scale(&mut self, factor: u32)`, щоб оновити`self.width`і`self.height` шляхом множення їх на`factor`.
Рішення доступне після 3 спроб