Константа трейта в Rust
Описание набора может требовать не только методы, но и число, известное при сборке. Его объявляют в теле трейта как константу, а в блоке выполнения для типа присваивают конкретное значение.
Зададим предел и две разные двери с разным лимитом:
trait Limit {
const MAX: i32;
}
struct Door {
id: i32,
}
impl Limit for Door {
const MAX: i32 = 3;
}
struct Gate {
id: i32,
}
impl Limit for Gate {
const MAX: i32 = 5;
}
fn main() {
println!("{} {}", Door::MAX, Gate::MAX);
}
На экране "3 5". Обращение идет через
имя типа и имя константы из трейта, без
создания значения. Так лимит можно читать
в общих функциях, ограниченных этим набором.
Константу из трейта можно использовать в методе того же блока выполнения:
trait Limit {
const MAX: i32;
fn within(&self, value: i32) -> bool;
}
struct Door {
id: i32,
}
impl Limit for Door {
const MAX: i32 = 3;
fn within(&self, value: i32) -> bool {
value <= Self::MAX
}
}
fn main() {
let door = Door { id: 1 };
let ok = door.within(2);
println!("{}", ok);
}
Дана структура:
struct Step {
level: i32,
}
Объявите трейт с константой MAX: i32,
подставьте 10 для Step и
выведите лимит через имя типа.
Дан следующий код:
struct Room {
name: &'static str,
}
Добавьте трейт с константой MAX: i32,
подставьте 2 для Room и метод, который сравнивает
число гостей с Self::MAX. Проверьте
значение 1 и выведите результат.
Скажите, чем ассоциированная константа
в трейте отличается от поля структуры
типа i32.