Подтвердить что ты не робот

Почему у Rust есть структура и перечисление?

Перечисления ржавчины являются алгебраическими типами данных. Насколько я могу судить, это, кажется, означает, что такое структура. Что отличается от структуры, которая требует ее сохранения?

4b9b3361

Ответ 1

Прежде всего, вы правы, что семантически enum строго превосходит struct в отношении того, что он может представлять, и поэтому struct несколько избыточно.

Однако здесь есть и другие элементы.

  • простота использования: значения в пределах enum могут быть доступны (напрямую) только путем сопоставления; отличие от простоты использования доступа к полю struct. Вы можете писать аксессоры для каждого поля, но это действительно громоздко.

  • документация: как enum расти, помня, что роль каждого элемента может стать трудной; не так в struct, поскольку каждое поле называется.

  • : enum - это тегированный союз, a struct имеет фиксированный макет; мы (программисты), как правило, ставим метки на вещи и, следовательно, можем дать разные имена различным функциям.

Как я вижу, 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 по-прежнему имеет эти три различных типа типов для удобства.


Обратите внимание, что я не знаю, являются ли эти определения перечисления на самом деле синтаксическим сахаром или нет. Но они могли быть, и это могло бы задуматься. это