stringtranslate.com

Перечислимый тип

В компьютерном программировании перечислимый тип (также называемый перечислением , enum или фактором в языке программирования R и категориальной переменной в статистике ) — это тип данных , состоящий из набора именованных значений , называемых элементами , членами , перечислениями или перечислителями тип. Имена перечислителей обычно представляют собой идентификаторы , которые в языке ведут себя как константы . Перечисляемый тип можно рассматривать как вырожденное объединение тегов единичного типа . Переменной , объявленной как имеющая перечисляемый тип , можно присвоить в качестве значения любой из перечислителей. Другими словами, перечислимый тип имеет значения, которые отличаются друг от друга, и их можно сравнивать и присваивать, но они не указаны программистом как имеющие какое-либо конкретное представление в памяти компьютера; компиляторы и интерпретаторы могут представлять их произвольно.

Например, четыре масти в колоде игральных карт могут быть четырьмя перечислителями с именами Club , Diamond , Heart и Spade , принадлежащими к перечисляемому типу с именем масти . Если переменная V объявлена ​​с типом данныхsuit, ей можно присвоить любое из этих четырех значений.

Хотя перечислители обычно различны, в некоторых языках допускается указание одного и того же перечислителя дважды в объявлении типа. Имена счетчиков не обязательно должны быть семантически полными или совместимыми в каком-либо смысле. Например, перечислимый тип с именем color может быть определен как состоящий из перечислителей Red , Green , Zebra , Missing и Bacon . В некоторых языках объявление перечислимого типа также намеренно определяет порядок его членов ( высокий , средний и низкий приоритеты); в других перечислители неупорядочены ( поддерживаются английский , французский , немецкий и испанский языки); в других случаях неявное упорядочение возникает из-за того, что компилятор конкретно представляет перечислители как целые числа.

Некоторые типы перечислителей могут быть встроены в язык. Например, тип Boolean часто представляет собой заранее определенное перечисление значений False и True . Тип единицы измерения, состоящий из одного значения, также может быть определен для представления null . Многие языки позволяют пользователям определять новые перечислимые типы.

Значения и переменные перечислимого типа обычно реализуются с использованием некоторого целочисленного типа в качестве базового представления. Некоторые языки, особенно языки системного программирования , позволяют пользователю указывать битовую комбинацию, которая будет использоваться для каждого перечислителя, что может быть полезно для эффективного представления наборов перечислителей в виде битовых строк фиксированной длины. В теории типов перечислимые типы часто рассматриваются как тегированные объединения единичных типов . Поскольку такие типы имеют вид , их также можно записать как натуральные числа.

Обоснование

Некоторые ранние языки программирования изначально не имели перечисляемых типов. Если программист хотел, чтобы переменная, например myColor , имела значение красного цвета, переменная red должна быть объявлена ​​и ей присвоено произвольное значение, обычно целочисленная константа. Переменная red будет затем присвоена myColor . Другие методы присваивали произвольные значения строкам, содержащим имена перечислителей.

Эти произвольные значения иногда называли магическими числами , поскольку часто не было объяснения того, как были получены числа и были ли их фактические значения значимыми. Эти магические числа могут затруднить понимание и поддержку исходного кода другими.

С другой стороны, перечислимые типы делают код более самодокументируемым. В зависимости от языка компилятор может автоматически присваивать перечислителям значения по умолчанию, тем самым скрывая от программиста ненужные детали. Эти значения могут быть даже не видны программисту (см. скрытие информации ). Перечислимые типы также могут помешать программисту писать нелогичный код, например выполнять математические операции над значениями перечислителей. Если бы значение переменной, которой был присвоен перечислитель, должно было быть напечатано, некоторые языки программирования также могли бы печатать имя перечислителя, а не его базовое числовое значение. Еще одним преимуществом является то, что перечислимые типы позволяют компиляторам обеспечивать семантическую корректность. Например: myColor = TRIANGLE может быть запрещено, хотя myColor = REDразрешено, даже если TRIANGLE и RED оба внутренне представлены как 1 .

Концептуально перечислимый тип аналогичен списку номиналов (числовых кодов), поскольку каждому возможному значению типа присваивается отличительное натуральное число. Таким образом, данный перечислимый тип является конкретной реализацией этого понятия. Когда порядок имеет смысл и/или используется для сравнения, перечислимый тип становится порядковым типом.

Конвенции

Языки программирования, как правило, имеют свои собственные, часто несколько стилей программирования и соглашения об именах . Переменная, присвоенная перечислению, обычно представляет собой существительное в единственном числе и часто соответствует соглашению PascalCase или прописному регистру, тогда как строчные и другие буквы встречаются реже.

Синтаксис в нескольких языках программирования

Паскаль и синтаксически подобные языки.

Паскаль

В Pascal перечислимый тип может быть неявно объявлен путем перечисления значений в списке в круглых скобках:

 вар масть : ( трефы , бубны , червы , пики ) ;     

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

 тип карточной масти = ( трефы , бубны , червы , пики ) ; карта = рекордная масть : карточная масть ; значение : 1 .. 13 ; конец ; varhand : массив [ 1..13 ] карты ;козырь : карточная масть ;                            

Порядок, в котором задаются значения перечисления, имеет значение. Перечисляемый тип является порядковым типом, а функции predи succвозвращают предыдущее или следующее значение перечисления и ordмогут преобразовывать значения перечисления в их целочисленное представление. Однако стандартный Паскаль не предлагает преобразования арифметических типов в перечисления. Extended Pascal предлагает эту функциональность посредством расширенной succфункции. Некоторые другие диалекты Паскаля допускают это посредством приведения типов. Некоторые современные потомки Паскаля, такие как Modula-3 , предоставляют специальный синтаксис преобразования с использованием метода под названием VAL; Modula-3 также рассматривает BOOLEANи CHARкак специальные предопределенные перечислимые типы и использует ORDстандартное VALдекодирование и кодирование ASCII.

Языки стиля Паскаль также позволяют использовать перечисление в качестве индекса массива:

 varsuitcount : массив [ карточная масть ] целых чисел ;     

Ада

В Ada использование «=" было заменено на «is», оставив определение очень похожим:

тип  карточной масти  (  трефы , бубны  , червы  , пики  ) ;

Помимо Pred, Succи ValAda Posтакже поддерживает простые преобразования строк с помощью Imageи Value.

Подобно языкам C-стиля, Ada позволяет указать внутреннее представление перечисления:

для  использования карточной масти  ( трефы => 1 , бубны => 2 , червы => 4 , пики => 8 );            

В отличие от языков C-стиля, Ada также позволяет указывать количество бит перечисления:

для  размера Cardsuit используйте 4 ;-- 4 бита   

Кроме того, можно использовать перечисления в качестве индексов для массивов, как в Паскале, но для перечислений определены атрибуты.

 Shuffle  :  постоянный  массив ( Cardsuit )  Cardsuit  := ( Clubs => Cardsuit ' Succ ( Clubs ), -- см. атрибуты перечислений 'First, 'Last, 'Succ,' Pred Diamonds => Hearts , -- явное значение  Hearts => Cardsuit ' Last , --первое значение перечисления типа Cardsuit, например, трефы Пики => Cardsuit ' First --последнее значение перечисления типа Cardsuit, например, пики );                 

Подобно Модуле-3 , Ада рассматривает Booleanи Characterкак специальные, предопределенные (в пакете " Standard") перечислимые типы. В отличие от Модулы-3, можно также определить собственные типы символов:

тип  карты  (  ' 7 ',  ' 8 ',  ' 9 ',  ' J ',  ' Q ',  ' K ',  ' A ');

C и синтаксически подобные языки

С

Исходный диалект K&R языка программирования C не имел перечислимых типов. [1] В C перечисления создаются с помощью явных определений ( enumключевое слово само по себе не вызывает выделения памяти), которые используют это enumключевое слово и напоминают определения структур и объединений :

enum cardsuit { Трефы , Бубны , Червы , Пики };      struct card { enum cardsuitsuit ;короткое целое значение ; } рука [ 13 ];         enum козырная карточная масть ;  

C предоставляет целочисленное представление значений перечисления непосредственно программисту. Целые числа и перечислимые значения можно свободно смешивать, и все арифметические операции над перечисляемыми значениями разрешены. Переменная перечисления может даже содержать целое число, которое не представляет ни одного из значений перечисления. Фактически, согласно определению языка, приведенный выше код будет определять Clubs, Diamonds, Heartsи Spadesкак константы типа int, которые будут преобразованы (тихо) в них только enum cardsuitв том случае, если они сохранены в переменной этого типа.

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

enum cardsuit { Трефы = 1 , Бубны = 2 , Червы = 4 , Пики = 8 };              

может использоваться для определения типа, который позволяет представлять математические наборы мастей в виде enum cardsuitпоразрядных логических операций.

Начиная с C23 , базовый тип перечисления может быть указан программистом: [2]

enum cardsuit : char { Трефы = 1 , Бубны = 2 , Червы = 4 , Пики = 8 };                

С#

Перечислимые типы в языке программирования C# сохраняют большую часть семантики «малых целых чисел» перечислений C. Некоторые арифметические операции не определены для перечислений, но значение перечисления может быть явно преобразовано в целое число и обратно, а переменная перечисления может иметь значения, которые не были объявлены определением перечисления. Например, учитывая

enum Cardsuit { Трефы , Бубны , Пики , Червы }     

выражения CardSuit.Diamonds + 1и CardSuit.Hearts - CardSuit.Clubsразрешены напрямую (поскольку может иметь смысл пройти через последовательность значений или спросить, сколько шагов между двумя значениями), но CardSuit.Hearts * CardSuit.Spadesсчитается менее разумным и разрешено только в том случае, если значения сначала преобразуются в целые числа. .

C# также предоставляет подобную C возможность определять конкретные целочисленные значения для перечислений. Благодаря этому можно выполнять двоичные операции над перечислениями, рассматривая таким образом значения перечисления как наборы флагов. Эти флаги можно проверить с помощью двоичных операций или с помощью встроенного метода HasFlag типа Enum.

Определение перечисления определяет имена для выбранных целочисленных значений и является синтаксическим сахаром , поскольку можно присвоить переменной перечисления другие целочисленные значения, которые не входят в область определения перечисления. [3] [4] [5]

С++

В C++ есть типы перечисления, которые напрямую унаследованы от C и работают в основном аналогично этим, за исключением того, что перечисление является реальным типом в C++, что обеспечивает дополнительную проверку во время компиляции. Кроме того (как и в случае со структурами), ключевое слово C++ enumсочетается с typedef , так что вместо того, чтобы называть тип enum name, просто назовите его name. Это можно смоделировать в C, используя typedef:typedef enum {Value1, Value2} name;

В C++11 также предусмотрен второй вид перечисления, называемый перечислением с ограниченной областью действия . Они типобезопасны: перечислители не преобразуются неявно в целочисленный тип. Помимо прочего, это позволяет определить потоковую передачу ввода-вывода для типа перечисления. Другая особенность перечислений с ограниченной областью заключается в том, что перечислители не утекают, поэтому для использования требуется префикс с именем перечисления (например, Color::Redдля первого перечислителя в примере ниже), если только не использовалось using enumобъявление (введенное в C++20 ). чтобы перенести перечислители в текущую область видимости. Перечисление с областью действия определяется фразой enum class(или enum struct). Например:

enum class Color { Red , Green , Blue };     

Базовый тип перечисления — это определяемый реализацией целочисленный тип, достаточно большой для хранения всех перечисляемых значений; это не обязательно должен быть наименьший возможный тип. Базовый тип может быть указан напрямую, что позволяет «упреждающие объявления» перечислений:

цвет перечисления класса : long { Red , Green , Blue }; // по размеру и расположению памяти должен соответствовать типу 'long' enum class Shapes : char ; // форвардное объявление. Если позже будут определены значения, которые не помещаются в 'char', это ошибка.             

Идти

Go использует это iotaключевое слово для создания перечисляемых констант. [6]

введите ByteSize float64  const ( _ = iota // игнорируем первое значение, присваивая пустому идентификатору KB ByteSize = 1 << ( 10 * iota ) МБ ГБ )               

Хаксе

Перечислимые типы — важная особенность языка; они могут иметь параметры типа и быть рекурсивными. [7] Они обеспечивают базовую поддержку алгебраических типов данных , позволяя включать типы продуктов аналогично Haskell и ML . Выражение switchможет применять сопоставление шаблонов со значением перечисления, что позволяет элегантно решать сложные проблемы программирования:

перечисление Цвет { красный ; зеленый ; синий ; rgb ( r : Int , g : Int , b : Int ); }    класс Colors { статическая функция toInt ( c : Color ): Int { переключатель возврата ( c ) { красный регистр : 0xFF0000 ; зеленый регистр : 0x00FF00 ; синий регистр : 0x0000FF ; случай rgb ( р , г , б ): ( р << 16 ) | ( г << 8 ) | б ; } }                          статическая функция validCalls () { var redint = toInt ( Color . red ); var rgbint = toInt ( Color . rgb ( 100 , 100 , 100 )); } }           

Примерами параметрических типов перечислений являются типы стандартной библиотеки Haxe Option [8] и либо: [9]

enum Option < T > { Some ( v : T ); Никто ; }    enum Либо < L , R > { Влево ( v : L ); Вправо ( v : R ); }     
Haxe также поддерживает обобщенные алгебраические типы данных (GADT). [10] [11]

Джава

Диаграмма классов UML с перечислением.
Диаграмма классов UML с перечислением.

В J2SE версии 5.0 языка программирования Java добавлены перечислимые типы, синтаксис объявления которых аналогичен синтаксису C :

enum Cardsuit { трефы , бубны , пики , червы }; ... Козырная карточная масть ;        

Однако система типов Java рассматривает перечисления как тип, отдельный от целых чисел, и смешивание значений перечислений и целых чисел не допускается. Фактически, перечислимый тип в Java на самом деле представляет собой специальный класс, созданный компилятором, а не арифметический тип, и значения перечисления ведут себя как глобальные предварительно сгенерированные экземпляры этого класса. Перечисляемые типы могут иметь методы экземпляра и конструктор (аргументы которого можно указывать отдельно для каждого значения перечисления). Все типы перечислений неявно расширяют Enumабстрактный класс. Тип перечисления не может быть создан напрямую. [12]

Внутри каждое значение перечисления содержит целое число, соответствующее порядку, в котором они объявлены в исходном коде, начиная с 0. Программист не может напрямую установить собственное целое число для значения перечисления, но можно определить перегруженные конструкторы , которые затем могут назначать произвольные значения для самоопределенных членов класса перечисления. Определение геттеров позволяет получить доступ к этим самоопределенным членам. Внутреннее целое число можно получить из значения перечисления с помощью этого ordinal()метода, а список значений перечисления типа перечисления можно получить по порядку с помощью этого values()метода. Программистам обычно не рекомендуется преобразовывать перечисления в целые числа и наоборот. [13] Перечисляемые типы: Comparable, использующие внутреннее целое число; в результате их можно отсортировать.

Стандартная библиотека Java предоставляет служебные классы для использования с перечислениями. Класс EnumSetреализует перечисление Setзначений; он реализован как битовый массив , что делает его очень компактным и таким же эффективным, как явная манипуляция битами, но более безопасным. Класс EnumMapреализует перечисление Mapзначений для объекта. Он реализован как массив, в котором целочисленное значение значения перечисления служит индексом.

Перл

Динамически типизированные языки синтаксической традиции C (например, Perl или JavaScript ) обычно не предоставляют перечисления. Но в программировании на Perl тот же результат можно получить с помощью сокращенного списка строк и хэшей (возможно, срезов ):

my @enum = qw(трефы бубны червы пики) ; мой ( %set1 , %set2 ); @set1 { @enum } = (); # все очищено @set2 { @enum } = ( 1 ) x @enum ; # все установлено на 1 $set1 { Трефы } ... # false $set2 { Бубны } ... # true                  

Раку

Raku (ранее известный как Perl 6) поддерживает перечисления. В Raku существует несколько способов объявления перечислений, каждый из которых создает внутреннюю карту.

enum  Cat  <другие сфинксы, сиамские бенгальские короткошерстные> ; # Использование «слов-кавычек»
enum  Cat ( «сфинкс» , «сиамский» , «бенгальский» , «короткошерстный» , «другой» ); # Использование списка
enum  Cat ( сфинкс => 0 , сиамский => 1 , бенгальский => 2 , короткошерстный => 3 , другой => 4 ); # Использование конструкторов Pair
enum  Cat (: сфинкс ( 0 ), : сиамский ( 1 ), : бенгальский ( 2 ), короткошерстный ( 3 ), : другой ( 4 )); # Другой способ использования пар: вы также можете использовать `:0sphynx`

PHP

Перечисления были добавлены в PHP версии 8.1.

enum  CardSuit {  case  Hearts ;  чехол  Бриллианты ;  кейс  -клубы ;  чехол  Пики ; }

Перечислители могут поддерживаться строковыми или целочисленными значениями для облегчения сериализации:

enum  CardSuit :  string {  case  Hearts  =  'H' ;  случай  Алмазы  =  'D' ;  случай  Clubs  =  'C' ;  случай  Пики  =  'S' ; }

Интерфейс Enum предоставляет метод, который предоставляет коллекцию своих перечислителей и их имен. Перечисления с поддержкой строк или целых чисел также предоставляют резервное значение и методы для (попытки) десериализации. Пользователи могут добавлять дополнительные методы.

Ржавчина

Хотя Rust использует enumтакое же ключевое слово, как C, он использует его для описания тегированных объединений , чьи перечисления можно считать вырожденной формой. Таким образом, перечисления в Rust гораздо более гибкие и могут содержать варианты структур и кортежей.

enum  Message { Quit , Move { x : i32 , y : i32 }, // struct Write ( String ), // одноэлементный кортеж ChangeColor ( i32 , i32 , i32 ), // трехэлементный кортеж }              

Быстрый

В C перечисления присваивают связанные имена набору целочисленных значений. В Swift перечисления гораздо более гибкие и не требуют предоставления значения для каждого случая перечисления. Если для каждого случая перечисления указано значение (называемое необработанным значением), это значение может быть строкой, символом или значением любого целочисленного типа или типа с плавающей запятой.

Альтернативно, случаи перечисления могут указывать связанные значения любого типа, которые будут храниться вместе с каждым различным значением случая, так же, как это делают объединения или варианты в других языках. Можно определить общий набор связанных случаев как часть одного перечисления, с каждым из которых связан другой набор значений соответствующих типов.

В Swift перечисления являются первоклассным типом. Они используют многие функции, традиционно поддерживаемые только классами, такие как вычисляемые свойства для предоставления дополнительной информации о текущем значении перечисления и методы экземпляра для обеспечения функциональности, связанной со значениями, которые представляет перечисление. Перечисления также могут определять инициализаторы для предоставления начального значения регистра и могут быть расширены для расширения их функциональности за пределы их исходной реализации; и может соответствовать протоколам для обеспечения стандартной функциональности.

enum  CardSuit  {  кейс  трефы  кейс  бубны  кейс  червы  кейс  пики }

В отличие от C и Objective-C , случаям перечисления Swift не присваивается целочисленное значение по умолчанию при их создании. В приведенном выше примере CardSuit трефы, бубны, червы и пики не являются неявно равными 0, 1, 2 и 3. Вместо этого различные случаи перечисления сами по себе являются полноценными значениями с явно определенным типом CardSuit. .

В одной строке может быть указано несколько случаев, разделенных запятыми:

enum  CardSuit  {  случай  треф ,  бубен ,  червей ,  пик }

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

Например, когда для необработанных значений используются целые числа, неявное значение для каждого случая на одно больше, чем в предыдущем случае. Если в первом случае не установлено значение, его значение равно 0. В примере CardSuit масти можно пронумеровать, начиная с 1, написав:

enum  CardSuit  {  случай  треф  =  1 ,  бубны ,  червы ,  пики }

Машинопись

TypeScript добавляет в JavaScript тип данных enum.

enum Cardsuit { Трефы , Бубны , Червы , Пики }; var c : Cardsuit = Cardsuit . Бриллианты ;         

По умолчанию члены перечисления нумеруются, начиная с 0; это можно переопределить, установив значение первого:

enum Cardsuit { Трефы = 1 , Бубны , Червы , Пики }; var c : Cardsuit = Cardsuit . Бриллианты ;           

Все значения могут быть установлены:

enum Cardsuit { Трефы = 1 , Бубны = 2 , Червы = 4 , Пики = 8 }; var c : Cardsuit = Cardsuit . Бриллианты ;                 

TypeScript поддерживает сопоставление числового значения с его именем. Например, это находит имя значения 2:

enum Cardsuit { Трефы = 1 , Бубны , Червы , Пики }; varsuitName : string = Cardsuit [ 2 ] ;           оповещение ( имя костюма );

Питон

Модуль enum был добавлен в стандартную библиотеку Python в версии 3.4.

из  enum  import  Enum class  Карты ( Enum ):  БУБИНЫ  =  1  БУМБЫ  =  2  СЕРДЦА  =  3  ПИТЫ  =  4

Также имеется функциональный API для создания перечислений с автоматически генерируемыми индексами (начиная с единицы):

Cards  =  Enum ( "Cards" ,  "CLUBS DIAMONDS HEARTS SPADES" )

Перечисления Python не обеспечивают семантическую корректность (бессмысленное сравнение с несовместимым перечислением всегда возвращает False , а не вызывает TypeError ):

>>> Color  =  Enum ( «Цвет» ,  «КРАСНЫЙ, ЗЕЛЕНЫЙ, СИНИЙ» ) >>> Shape  =  Enum ( «Форма» ,  [ «КРУГ» ,  «ТРЕУГОЛЬНИК» ,  «КВАДРАТ» ,  «ШЕСТИУГОЛЬНИК» ]) >>> def  has_vertices ( shape ): ... return  shape  !=  Shape . КРУГ ... >>> has_vertices ( Цвет . ЗЕЛЕНЫЙ ) Истина

Фортран

В Фортране есть только нумерованные типы для совместимости с C; следовательно, семантика аналогична C, и, как и в C, значения перечисления являются просто целыми числами, и дополнительная проверка типов не выполняется. Приведенный выше пример C можно записать на Фортране как

enum , перечислитель привязки ( C ) :: БУБЫ = 1 , БУМБЫ = 2 , СЕРДЦА = 4 , ЛОПАТЫ = 8 end enum                 

Visual Basic/VBA

Перечисляемым типам данных в Visual Basic (до версии 6) и VBA автоматически присваивается Longтип данных « » и они сами становятся типами данных:

'Перечисление с нулевой отсчетом CardSuit Трефы Бубны Червы Пики Конец перечисления      Sub EnumExample () Тусклый костюм Как CardSuit костюм = Бриллианты MsgBox костюм Конец Sub           

Пример кода в VB.NET

Enum CardSuit Трефы Бубны Червы Пики Конец Enum      Sub EnumExample ( ) Dimsuit As CardSuitsuit = CardSuit .Ящик для сообщений о бриллиантах . шоу ( костюм ) End Sub          

Лисп

Common Lisp использует спецификатор типа члена, например:

( deftype cardsuit () ' ( пика для членов клуба с бриллиантовым сердцем ))       

в нем говорится, что объект относится к типу карточной масти, если это #'eqlтрефа, бубна, черва или пика. Однако спецификатор типа члена недопустим в качестве спецификатора параметров Common Lisp Object System (CLOS). Вместо этого можно использовать (eql atom), что эквивалентно (member atom)(то есть только один член набора может быть указан с помощью спецификатора типа eql, однако его можно использовать в качестве специалиста параметра CLOS.) Другими словами, для определения методов Чтобы охватить перечислимый тип, метод должен быть определен для каждого конкретного элемента этого типа.

Кроме того,

( deftype тип набора конечных элементов ( &rest elements ) ` ( member ,@ elements ))     

может использоваться для определения произвольных перечислимых типов во время выполнения. Например

( трепа с алмазным сердцем типа набора конечных элементов )    

будет относиться к типу, эквивалентному предыдущему определению карточной масти, поскольку, конечно, просто использовалось бы

( член клуба с алмазным сердцем -лопатой )    

но может быть меньше путаницы с этой функцией #'memberпо стилистическим причинам.

Дарт

Dart поддерживает самую базовую форму перечислений и имеет синтаксис, который во многом похож на синтаксис других языков, поддерживающих перечисления.

перечисление CardSuite {   Клубы , Бриллианты , Сердца , Пики}пустая функция () {   Карта CardSuite = CardSuite . Клубы ;    // Dart использует оператор переключения для сопоставления значения перечисления с желаемым результатом. переключатель ( карта ) {   чехол CardSuite . Клубы: {   распечатать ( «Клубы» ); } перерыв ; чехол CardSuite . Бриллианты: {   печать ( «Бриллианты» ); } перерыв ; чехол CardSuite . Червы: {   распечатать ( «Сердечки» ); } перерыв ; чехол CardSuite . Пики: {   распечатать ( «Пики» ); } перерыв ; по умолчанию : {  печать ( «Неизвестно» ); } перерыв ; }}

Обратите внимание, что оператор переключения не гарантирует полноту случаев. Это означает, что если вы пропустите один случай, компилятор не выдаст ошибку.

Алгебраический тип данных в функциональном программировании

В языках функционального программирования линии ML (например, Standard ML (SML), OCaml и Haskell ) для реализации перечислимого типа может использоваться алгебраический тип данных только с нулевыми конструкторами . Например (в синтаксисе подписей SML):

тип данных  карточная масть  =  Трефы  |  Бриллианты  |  Сердца  |  Карта типа пик = { масть : карточная масть ; значение : int } val рука : список карт val козырь : карточная масть               

В этих языках представление малых целых чисел полностью скрыто от программиста, если такое представление действительно используется реализацией. Однако в Haskell есть Enum класс типов , который тип может получить или реализовать, чтобы получить соответствие между типом и Int.

Базы данных

Некоторые базы данных напрямую поддерживают перечислимые типы. MySQL предоставляет перечислимый тип ENUMс допустимыми значениями, указанными в виде строк при создании таблицы. Значения сохраняются как числовые индексы, при этом пустая строка сохраняется как 0, первое строковое значение сохраняется как 1, второе строковое значение сохраняется как 2 и т. д. Значения можно сохранять и извлекать как числовые индексы или строковые значения. [14]

Пример:

CREATE TABLE рубашки ( имя VARCHAR ( 40 ), размер ENUM ( 'x-small' , 'small' , 'medium' , 'large' , 'x-large' ) );           

XML-схема

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

<xs:element name= "cardsuit" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:enumeration value= "Clubs" /> <xs:enumeration value= "Diamonds" /> < xs:enumeration value= "Hearts" /> <xs:enumeration value= "Spades" /> </xs:restriction> </xs:simpleType> </xs:element>              

Смотрите также

Рекомендации

  1. ^ Керниган, Брайан В .; Ричи, Деннис М. (февраль 1978 г.). Язык программирования C (1-е изд.). Энглвуд Клиффс, Нью-Джерси : Прентис Холл . ISBN 0-13-110163-3.
  2. ^ «WG14-N3030: Улучшения перечислений» . 19 июля 2022 г.
  3. ^ Обасанджо, Дэйр (2007). «Сравнение языка программирования C# от Microsoft с языком программирования Java от Sun Microsystems». Архивировано из оригинала 10 сентября 2012 г. Проверено 6 сентября 2012 г. В Java перечисляемые типы представляют собой полноценный класс, что означает, что они типобезопасны и могут быть расширены путем добавления методов, полей или даже реализации интерфейсов. В то время как в C# перечислимый тип представляет собой просто синтаксический сахар вокруг целочисленного типа (обычно int), что означает, что они не могут быть расширены и не являются типобезопасными.{{cite web}}: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
  4. ^ Грунц, Доминик, профессор доктор (08 апреля 2005 г.). «Java 5: Укрощение тигра: синтаксический сахар» (на немецком языке). Fachhochschule Aargau, Нордвестшвейц. Архивировано из оригинала 7 января 2007 г. Проверено 10 сентября 2012 г. Enumerationen sind die heimlichen Sieger von Java 1.5. Nach vielen Beteuerungen durch Sun, Enums seien на Java überflüssig und können einfach nachgebildet werden, wurden sie nun doch eingeführt. Die einfachste Möglichkeit einer Enumeration der Jahreszeiten sieht wie folgt aus… Das Schlüsselwort enum steht für eine spezielle Art von Klasse, die eine Enumeration Definiert. … Im Gegensatz zu anderen Programmiersprachen wie C/C++ и C# kann man ihnen per Gleichheitszeichen keine ganzen Zahlen zuordnen.{{cite web}}: CS1 maint: несколько имен: список авторов ( ссылка )Альтернативный URL-адрес. Архивировано 27 мая 2013 г. на Wayback Machine.
  5. ^ Трутер, Кристофф (4 августа 2011 г.). «Синтаксический сахар (C#): Enum». CSTrüter. Архивировано из оригинала 7 января 2007 г. Проверено 10 сентября 2012 г. // Плохо спроектированное перечисление не делает этого... Очевидно (как и во всем остальном), мы можем неправильно использовать этот кусок сахара, в результате чего система будет страдать от гипергликемии. … Поскольку базовым типом нашего перечисления является int (также можно использовать другие целочисленные типы), это может привести к некоторым интересным проблемам при использовании перечисления в качестве битовых флагов с помощью побитовых операторов.{{cite web}}: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
  6. ^ «Эффективное движение». golang.org . Авторы Go . Проверено 13 мая 2014 г.
  7. ^ "Справочник по Haxe, подробно описывающий использование перечисления" . Архивировано из оригинала 11 мая 2012 г.
  8. ^ "haxe/Option.hx в стадии разработки · HaxeFoundation/haxe" . Гитхаб . 7 ноября 2021 г.
  9. ^ "haxe/Either.hx в разработке · HaxeFoundation/haxe" . Гитхаб . 7 ноября 2021 г.
  10. ^ «Особенности языка». Haxe — кроссплатформенный набор инструментов . Фонд Хаксе . Проверено 30 апреля 2015 г.
  11. ^ "haxe/TestGADT.hx в разработке · HaxeFoundation/haxe" . Гитхаб . 7 ноября 2021 г.
  12. ^ «Типы перечислений». Оракул . Проверено 5 декабря 2013 г.
  13. ^ Блох, Джошуа (2008). Эффективная Java (Второе изд.). Река Аппер-Сэддл, Нью-Джерси: Аддисон-Уэсли. п. 158. ИСБН 978-0-321-35668-0.
  14. ^ «MySQL :: Справочное руководство MySQL 8.0 :: 11.3.5 Тип ENUM» . dev.mysql.com . Проверено 19 сентября 2021 г.

Внешние ссылки