Использование предопределенной структуры в перечислении

#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) .