Метод перечисления в Rust
Метод можно привязать не только к структуре, но и к перечислению. Блок пишут после имени типа перечисления, а внутри снова перечисляют функции с получателем. Вызов через точку работает так же, как у структуры.
Запишем метод, который проверяет, совпадает ли значение с выбранным вариантом:
enum Status {
Draft,
Sent,
Done,
}
impl Status {
fn is_done(&self) -> bool {
match self {
Status::Done => true,
Status::Draft => false,
Status::Sent => false,
}
}
}
Создадим значение и вызовем метод:
let s = Status::Sent;
println!("{}", s.is_done());
На экране false. Внутри метода разбор
сравнивает текущий вариант с именами по
очереди и возвращает результат проверки.
К одному перечислению можно добавить несколько методов с разными именами:
enum Light {
Red,
Yellow,
Green,
}
impl Light {
fn is_red(&self) -> bool {
match self {
Light::Red => true,
Light::Yellow => false,
Light::Green => false,
}
}
fn is_green(&self) -> bool {
match self {
Light::Green => true,
Light::Red => false,
Light::Yellow => false,
}
}
}
Создадим значение и вызовем оба метода:
let light = Light::Green;
println!("{}", light.is_red());
println!("{}", light.is_green());
Дано перечисление:
enum Role {
Guest,
Member,
Admin,
}
let role = Role::Member;
Добавьте метод, который возвращает true
только для варианта Admin, и выведите
результат для role.
Дано перечисление:
enum Mode {
Off,
On,
}
let mode = Mode::On;
Запишите метод, который возвращает true
для On и false для Off.
Выведите результат.
Скажите, можно ли вызвать метод перечисления у переменной через точку, как у структуры.