Перечисления ржавчины являются алгебраическими типами данных. Насколько я могу судить, это, кажется, означает, что такое структура. Что отличается от структуры, которая требует ее сохранения?
Почему у Rust есть структура и перечисление?
Ответ 1
Прежде всего, вы правы, что семантически enum
строго превосходит struct
в отношении того, что он может представлять, и поэтому struct
несколько избыточно.
Однако здесь есть и другие элементы.
-
простота использования: значения в пределах
enum
могут быть доступны (напрямую) только путем сопоставления; отличие от простоты использования доступа к полюstruct
. Вы можете писать аксессоры для каждого поля, но это действительно громоздко. -
документация: как
enum
расти, помня, что роль каждого элемента может стать трудной; не так вstruct
, поскольку каждое поле называется. -
:
enum
- это тегированный союз, astruct
имеет фиксированный макет; мы (программисты), как правило, ставим метки на вещи и, следовательно, можем дать разные имена различным функциям.
Как я вижу, struct
является синтаксическим сахаром. Я обычно предпочитаю скудный и скудный, но немного сахара может пройти долгий путь в увеличении того, что можно представить кратко.
Примечание: были предложения по слиянию двух в одном пакете; сохраняя сахар и документацию, но отбрасывая различие.
Ответ 2
Во-первых, Rust имеет широкий набор типов данных:
- Структуры с именованными полями (
struct Foo {bar: uint}
) - Структуры Tuple (
struct Foo(pub Bar, Baz)
) - Структуры без полей (
struct Foo;
) - Перечисления с различными типами вариантов:
- Варианты без полей (например,
None
) - Варианты Tuple (например,
Some(T)
) - Варианты структуры (например,
Some {pub inner :T}
) [Это экспериментальные]
- Варианты без полей (например,
Это дает программисту некоторую гибкость в определении типов данных. Часто вам не нужны именованные поля, особенно если struct/variant имеет только одно поле. В этом случае Rust позволяет использовать кортежные структуры/кортежи.
Если бы структуры были удалены из Rust, не было бы потери функциональности, снова можно было бы использовать перечисления со строковыми вариантами. Но было бы подавляющее количество одновариантных перечислений, которые были бы ненужными и громоздкими для использования.
Ответ 3
Не 100% правильный, но еще один хороший способ подумать об этом: enum
на самом деле не превосходит struct
, синтаксический сахар просто заставляет его выглядеть так, как есть.
An enum
- тип суммы, означающий, что это значение является одним значением одного из множества других типов. Тип Result<T, E>
имеет тип T
или E
. Таким образом, каждый enum
вариант имеет ровно один тип, связанный с ним. Все остальное (без типов, кортежей и вариантов конструкций) может быть синтаксическим сахаром.
enum Animal {
// without syntax sugar
Cat(i32),
// desugars to `Dog(())` (empty tuple/unit)
Dog,
// desugars to `Horse((i32, bool))` (tuple)
Horse(i32, bool),
// desugars to `Eagle(GeneratedEagleType)` and a struct definition outside
// of this enum `struct GeneratedEagleType { weight: i32, male: bool }`
Eagle { weight: i32, male: bool }
}
Поэтому было бы достаточно, если бы каждый enum
вариант был бы связан только с одним типом. И в этом случае enum
не превосходит struct
, потому что он не может создавать типы продуктов (например, struct
).
Чтобы написать "определение типа" внутри определения варианта перечисления, просто для удобства.
Также: struct
также превосходит "кортежные структуры" и "кортежи". Если мы игнорируем имена, эти три вещи почти эквивалентны. Но Rust по-прежнему имеет эти три различных типа типов для удобства.
Обратите внимание, что я не знаю, являются ли эти определения перечисления на самом деле синтаксическим сахаром или нет. Но они могли быть, и это могло бы задуматься. это