Образец перечисления в Rust
У перечисления каждый вариант - отдельная форма значения. В образце пишут имя варианта и, если у него есть поля, скобки или фигурные скобки с именами для данных. Так одна ветка разбора и выбирает вариант, и открывает его содержимое.
Вариант без данных сравнивают просто по
имени. Вариант с одной строкой или числом
записывают как Text(t): буква в скобках
получает владение или ссылку в зависимости
от того, как устроен тип.
Разберем простые сообщения:
enum Msg {
Ping,
Text(String),
}
fn main() {
let msg = Msg::Text(String::from("hi"));
let out = match msg {
Msg::Ping => String::from("ping"),
Msg::Text(t) => t,
};
println!("{}", out);
}
На экране "hi". Ветка Text(t)
забрала строку в t, а вариант
Ping обработали отдельно.
Несколько вариантов с данными различают по имени и форме скобок:
enum Packet {
Empty,
Number(i32),
Pair(i32, i32),
}
fn main() {
let p = Packet::Pair(2, 3);
let sum = match p {
Packet::Empty => 0,
Packet::Number(n) => n,
Packet::Pair(a, b) => a + b,
};
println!("{}", sum);
}
Дано перечисление:
enum Shape {
Circle,
Square(u32),
}
let s = Shape::Square(5);
Разберите s: для круга выведите
"round", для квадрата выведите
сторону из варианта.
Дано перечисление:
enum Job {
Stop,
Run(u32),
}
let job = Job::Run(7);
Запишите разбор, который для Run
удваивает число варианта, а для Stop
дает ноль, и выведите результат.
Скажите, можно ли в одной ветке разбора объединить два разных варианта перечисления через запятую в образце.