#rust
Вопрос:
Я видел этот код:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {}
Похоже, что автор кода определяет структуры прямо внутри перечисления. Как правильно это назвать? Как это работает? Есть ли способ поместить предопределенную структуру в перечисление?
struct Run { distance: i32 }
enum Message {
Run, // already defined so we just write Run instead of Run { distance: i32 }
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {}
Я думаю, это не сработает, так что же мне делать вместо этого?
Комментарии:
1. Прочитайте Язык Программирования Rust .
Ответ №1:
Элементы перечисления, которые вы определяете, и структура или значение, которые они содержат, различны, поэтому вы не можете сделать то, что пытаетесь сделать; но вы можете приблизиться:
struct Run { distance: i32 }
enum Message {
Run(Run),
Quit,
}
fn main() {
let m = Message::Run(Run { distance: 32 });
}
В этом случае у вас есть a struct Run
, а также a Message::Run
, которое содержит единственное значение, которое оказывается a struct Run
.
Комментарии:
1. Сообщение::Выполнить вместо Выполнить::Сообщение, или я ошибаюсь?
Ответ №2:
Варианты перечисления могут хранить данные в rust. Это часто называют типом суммы или типом данных algabreic.
Эти данные могут быть структурой или кортежем (что в основном является простой формой структуры), и их тип таков Enum::Variant
.
Во втором примере тип Message::Run отличается от типа Run в корне ящика, поэтому rustc не будет использовать crate::Run в качестве типа для сообщения::Run. Чтобы сделать это правильно, вы можете либо объявить Запуск в строке, как в вашем первом примере, либо сделать свой вариант Run(Run)
.