В компьютерном программировании перечислимый тип (также называемый перечислением , 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
и Val
Ada 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 ');
Исходный диалект 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 ); }
В 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 версии 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 (до версии 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-схема поддерживает перечислимые типы посредством аспекта перечисления, используемого для ограничения большинства примитивных типов данных, таких как строки.
<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>
В Java перечисляемые типы представляют собой полноценный класс, что означает, что они типобезопасны и могут быть расширены путем добавления методов, полей или даже реализации интерфейсов. В то время как в C# перечислимый тип представляет собой просто синтаксический сахар вокруг целочисленного типа (обычно int), что означает, что они не могут быть расширены и не являются типобезопасными.
{{cite web}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )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.// Плохо спроектированное перечисление не делает этого... Очевидно (как и во всем остальном), мы можем неправильно использовать этот кусок сахара, в результате чего система будет страдать от гипергликемии. … Поскольку базовым типом нашего перечисления является int (также можно использовать другие целочисленные типы), это может привести к некоторым интересным проблемам при использовании перечисления в качестве битовых флагов с помощью побитовых операторов.
{{cite web}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )