Несколько блоков на тип в Rust
Методы одного типа можно записать в нескольких блоках в одном файле. Компилятор складывает их в один набор: имена не должны повторяться, а вызов через точку видит все методы сразу, неважно, в каком блоке они объявлены.
Разнесем чтение возраста и чтение имени по двум блокам:
struct User {
name: &'static str,
age: i32,
}
impl User {
fn age(&self) -> i32 {
self.age
}
}
impl User {
fn name(&self) -> &'static str {
self.name
}
}
Создадим значение и вызовем оба метода:
let user = User { name: "ann", age: 20 };
println!("{}", user.name());
println!("{}", user.age());
Оба вызова идут через одну переменную. Компилятор выбирает метод по имени после точки. Блоки не мешают друг другу, пока имена различаются.
Так удобно группировать действия по смыслу или добавлять новые методы позже, не раздувая один большой блок:
struct User {
name: &'static str,
age: i32,
}
impl User {
fn adult(&self) -> bool {
self.age >= 18
}
}
impl User {
fn birthday(&mut self) {
self.age += 1;
}
}
Проверим возраст до и после вызова:
let mut user = User { name: "bob", age: 17 };
println!("{}", user.adult());
user.birthday();
println!("{}", user.adult());
Дана структура:
struct User {
name: &'static str,
age: i32,
}
let user = User { name: "bob", age: 16 };
В двух блоках добавьте методы: один возвращает
имя, второй сообщает, есть ли 18 лет
или больше. Выведите оба результата.
Дана структура:
struct Counter {
value: i32,
}
let counter = Counter { value: 5 };
Запишите в одном блоке метод, который возвращает
поле, и во втором метод, который возвращает
поле, увеличенное на 1, не меняя
исходное значение. Выведите оба результата.
Скажите, сколько блоков можно записать для одного типа, если имена методов не повторяются.