В программировании компьютера перечислимый тип ( также называемый перечислением , перечислением или фактором в языке программирования R и категориальной переменной в статистике) — это тип данных, состоящий из набора именованных значений , называемых элементами , членами , перечислением или перечислителями типа. Имена перечислителей обычно являются идентификаторами , которые ведут себя как константы в языке. Перечислимый тип можно рассматривать как вырожденное помеченное объединение типа unit . Переменной , которая была объявлена как имеющая перечислимый тип, может быть назначен любой из перечислителей в качестве значения. Другими словами, перечислимый тип имеет значения, которые отличаются друг от друга и которые можно сравнивать и назначать, но которые не указаны программистом как имеющие какое-либо конкретное представление в памяти компьютера; компиляторы и интерпретаторы могут представлять их произвольно.
Например, четыре масти в колоде игральных карт могут быть четырьмя перечислителями с именами Club , Diamond , Heart и Spade , принадлежащими к перечислимому типу с именем suit . Если переменная V объявлена с типом данных suit , ей можно присвоить любое из этих четырех значений.
Хотя перечислители обычно различны, некоторые языки могут разрешать дважды указывать один и тот же перечислитель в объявлении типа. Имена перечислителей не обязательно должны быть семантически полными или совместимыми в каком-либо смысле. Например, перечислимый тип с именем color может быть определен как состоящий из перечислителей Red , Green , Zebra , Missing и Bacon . В некоторых языках объявление перечислимого типа также намеренно определяет порядок его членов ( высокий , средний и низкий приоритеты); в других перечислители не упорядочены ( поддерживаются английский , французский , немецкий и испанский языки); в других неявный порядок возникает из-за того, что компилятор конкретно представляет перечислители как целые числа.
Некоторые типы перечислителей могут быть встроены в язык. Например, тип Boolean часто является предопределенным перечислением значений False и True . Тип единицы, состоящий из одного значения, также может быть определен для представления null . Многие языки позволяют пользователям определять новые перечислимые типы.
Значения и переменные перечисляемого типа обычно реализуются с некоторым целочисленным типом в качестве базового представления. Некоторые языки, особенно языки системного программирования , позволяют пользователю указывать комбинацию битов, которая будет использоваться для каждого перечислителя, что может быть полезно для эффективного представления наборов перечислителей в виде битовых строк фиксированной длины. В теории типов перечисляемые типы часто рассматриваются как помеченные объединения типов единиц . Поскольку такие типы имеют форму , их также можно записывать как натуральные числа.
Некоторые ранние языки программирования изначально не имели перечислимых типов. Если программист хотел, чтобы переменная, например myColor , имела значение red, переменная red объявлялась и ей присваивалось некоторое произвольное значение, обычно целочисленная константа. Затем переменная red присваивалась myColor . Другие методы присваивали произвольные значения строкам, содержащим имена перечислителей.
Эти произвольные значения иногда назывались магическими числами, поскольку часто не было объяснений относительно того, как были получены эти числа или были ли их фактические значения значимыми. Эти магические числа могли сделать исходный код более сложным для понимания и поддержки другими.
Перечислимые типы, с другой стороны, делают код более самодокументируемым. В зависимости от языка компилятор может автоматически назначать значения по умолчанию перечислителям, тем самым скрывая ненужные детали от программиста. Эти значения могут даже не быть видны программисту (см. скрытие информации ). Перечислимые типы также могут помешать программисту писать нелогичный код, такой как выполнение математических операций со значениями перечислителей. Если значение переменной, которой был назначен перечислитель, должно было быть выведено на печать, некоторые языки программирования также могли бы выводить имя перечислителя, а не его базовое числовое значение. Еще одним преимуществом является то, что перечислимые типы могут позволять компиляторам обеспечивать семантическую корректность. Например: myColor = TRIANGLE
может быть запрещено, в то время как myColor = RED
принимается, даже если TRIANGLE и RED оба внутренне представлены как 1 .
Концептуально, перечислимый тип похож на список номиналов (числовых кодов), поскольку каждому возможному значению типа назначается отличительное натуральное число. Таким образом, данный перечислимый тип является конкретной реализацией этого понятия. Когда порядок имеет смысл и/или используется для сравнения, то перечислимый тип становится порядковым типом .
Языки программирования, как правило, имеют свои собственные, часто множественные, стили программирования и соглашения об именовании . Переменная, назначенная перечислению, обычно является существительным в единственном числе и часто следует либо соглашению PascalCase , либо соглашению о заглавных буквах , в то время как строчные и другие встречаются реже.
В языке Pascal перечислимый тип может быть неявно объявлен путем перечисления значений в списке, заключенном в скобки:
масть вар : ( трефы , бубны , червы , пики ) ;
Объявление часто появляется в объявлении синонима типа, поэтому его можно использовать для нескольких переменных:
тип карточная масть = ( трефы , бубны , червы , пики ) ; карта = запись масть : карточная масть ; значение : 1 .. 13 ; конец ; var рука : массив [ 1 .. 13 ] карт ; козырь : карточная масть ;
Порядок, в котором задаются значения перечисления, имеет значение. Перечислимый тип является порядковым типом, а функции pred
и succ
вернут предыдущее или следующее значение перечисления и ord
могут преобразовывать значения перечисления в их целочисленное представление. Однако стандартный Pascal не предлагает преобразование из арифметических типов в перечисления. Расширенный Pascal предлагает эту функциональность через расширенную succ
функцию. Некоторые другие диалекты Pascal допускают это через приведение типов. Некоторые современные потомки Pascal, такие как Modula-3 , предоставляют специальный синтаксис преобразования, используя метод, называемый VAL
; Modula-3 также рассматривает BOOLEAN
и CHAR
как специальные предопределенные перечислимые типы и использует ORD
и VAL
для стандартного декодирования и кодирования ASCII.
Языки в стиле Pascal также позволяют использовать перечисление в качестве индекса массива:
var suitcount : массив [ cardsuit ] целых чисел ;
В языке Ada использование «=" было заменено на «is», что сделало определение практически таким же:
Тип масти карт ( трефы , бубны , червы , пики );
В дополнение к Pred
, Succ
, Val
и Pos
Ada также поддерживает простые преобразования строк через Image
и Value
.
Подобно языкам в стиле C, Ada позволяет задать внутреннее представление перечисления:
для использования карточной масти ( трефы => 1 , бубны => 2 , червы => 4 , пики => 8 );
В отличие от языков типа C, Ada также позволяет указывать количество бит перечисления:
для размера Cardsuit используйте 4 ; -- 4 бита
Кроме того, можно использовать перечисления в качестве индексов для массивов, как в Pascal, но для перечислений определены атрибуты.
Shuffle : константный массив ( Cardsuit ) Cardsuit := ( Clubs => Cardsuit ' Succ ( Clubs ), -- см. атрибуты перечислений 'First, 'Last, 'Succ, 'Pred Diamonds => Hearts , -- явное значение Hearts => Cardsuit ' Last , -- первое значение перечисления типа Cardsuit , например, clubs Spades => Cardsuit ' First -- последнее значение перечисления типа Cardsuit , например, spades );
Подобно Modula-3, Ada рассматривает Boolean
и Character
как специальные предопределенные (в пакете " Standard
") перечислимые типы. В отличие от Modula-3 можно также определять собственные символьные типы:
Тип карт : (' 7 ', ' 8 ', ' 9 ', ' J ', ' Q ', ' K ', ' A ');
В исходном диалекте K&R языка программирования C не было перечислимых типов. [1] В C перечисления создаются явными определениями ( enum
ключевое слово само по себе не приводит к выделению памяти), которые используют enum
ключевое слово и напоминают определения структур и объединений :
enum cardsuit { Трефы , Бубны , Червы , Пики }; struct card { enum cardsuit suit ; short int value ; } рука [ 13 ]; enum cardsuit trump ;
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++, что дает дополнительную проверку во время компиляции. Также (как и в случае со структурами) enum
ключевое слово C++ объединено с 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 Цвет { Красный , Зеленый , Синий };
Базовый тип перечисления — это определенный реализацией целочисленный тип, который достаточно велик, чтобы вместить все перечисленные значения; он не обязательно должен быть наименьшим возможным типом. Базовый тип может быть указан напрямую, что позволяет делать «предварительные объявления» перечислений:
enum class Color : long { Red , Green , Blue }; // должен соответствовать по размеру и размещению в памяти типу 'long' enum class Shapes : char ; // предварительное объявление. Если позже будут определены значения, которые не помещаются в 'char', это ошибка.
Go использует iota
ключевое слово для создания перечисляемых констант. [6]
тип ByteSize float64 const ( _ = iota // игнорировать первое значение, присваивая его пустому идентификатору KB ByteSize = 1 << ( 10 * iota ) MB GB )
Перечислимые типы являются важной особенностью языка; они могут иметь параметры типа и быть рекурсивными. [7] Они обеспечивают базовую поддержку алгебраических типов данных , позволяя включать типы продуктов , подобно Haskell и ML . switch
Выражение может применять сопоставление с образцом к значению перечисления, что позволяет изящно решать сложные проблемы программирования:
enum Color { красный ; зеленый ; синий ; rgb ( r : Int , g : Int , b : Int ); } класс Colors { статическая функция toInt ( c : Color ): Int { return switch ( c ) { case red : 0xFF0000 ; case green : 0x00FF00 ; case blue : 0x0000FF ; case rgb ( r , g , b ): ( r << 16 ) | ( g << 8 ) | b ; } } статическая функция validCalls ( ) { var redint = toInt ( Color.red ) ; var rgbint = toInt ( Color.rgb ( 100 , 100 , 100 ) ) ; } }
Примерами параметрических типов перечисления являются типы стандартной библиотеки Haxe Option [8] и Either: [9]
enum Option < T > { Some ( v : T ); None ; } enum Либо < L , R > { Лево ( v : L ); Право ( v : R ); }
В версию 5.0 J2SE языка программирования Java добавлены перечислимые типы, синтаксис объявления которых похож на синтаксис языка C :
enum Карточная масть { CLUBS , DIAMONDS , SPADES , HEARTS }; ... Карточная масть козырь ;
Однако система типов Java рассматривает перечисления как тип, отдельный от целых чисел, и смешивание значений перечисления и целых чисел не допускается. Фактически, тип перечисления в Java на самом деле является специальным классом , сгенерированным компилятором , а не арифметическим типом, и значения перечисления ведут себя как глобальные предварительно сгенерированные экземпляры этого класса. Типы перечисления могут иметь методы экземпляра и конструктор (аргументы которого могут быть указаны отдельно для каждого значения перечисления). Все типы перечисления неявно расширяют Enum
абстрактный класс. Тип перечисления не может быть создан напрямую. [12]
Внутри каждое значение перечисления содержит целое число, соответствующее порядку, в котором они объявлены в исходном коде, начиная с 0. Программист не может напрямую задать пользовательское целое число для значения перечисления, но можно определить перегруженные конструкторы , которые затем могут назначать произвольные значения самоопределенным членам класса перечисления. Определение геттеров позволяет затем получить доступ к этим самоопределенным членам. Внутреннее целое число может быть получено из значения перечисления с помощью метода ordinal()
, а список значений перечисления типа перечисления может быть получен по порядку с помощью метода values()
. Обычно программистам не рекомендуется преобразовывать перечисления в целые числа и наоборот. [13] Перечисляемые типы — это Comparable
, использующие внутреннее целое число; в результате их можно сортировать.
Стандартная библиотека Java предоставляет служебные классы для использования с перечислениями. EnumSet
Класс реализует a Set
значений перечисления; он реализован как битовый массив , что делает его очень компактным и таким же эффективным, как явная манипуляция битами, но более безопасным. Класс EnumMap
реализует a Map
значений перечисления для объекта. Он реализован как массив, причем целочисленное значение значения перечисления служит индексом.
Динамически типизированные языки в синтаксической традиции C (например, Perl или JavaScript ) в общем случае не предоставляют перечисления. Но в программировании на Perl тот же результат может быть получен с помощью сокращенных строк list и хэшей (возможно slices ):
my @enum = qw(Clubs Bulls Hearts Spades) ; my ( %set1 , %set2 ); @set1 { @enum } = (); # все очищено @set2 { @enum } = ( 1 ) x @enum ; # все установлено в 1 $set1 { Clubs } ... # false $set2 { Diamonds } ... # true
Raku (ранее известный как Perl 6) поддерживает перечисления. В Raku есть несколько способов объявить перечисления, все они создают бэкенд Map.
enum Cat <сфинкс сиамская бенгальская короткошерстная другая> ; # Использование "цитатных слов"
enum Cat ( 'сфинкс' , 'сиамский' , 'бенгал' , 'короткошерстный' , 'другой' ); # Использование списка
enum Cat ( sphynx => 0 , siamese => 1 , bengal => 2 , shorthair => 3 , other => 4 ); # Использование конструкторов Pair
enum Cat (: sphynx ( 0 ), : siamese ( 1 ), : bengal ( 2 ), shorthair ( 3 ), : other ( 4 )); # Другой способ использования пар, вы также можете использовать `:0sphynx`
Перечисления были добавлены в PHP версии 8.1.
enum CardSuit { case Червы ; case Бубны ; case Трефы ; case Пики ; }
Перечислители могут поддерживаться строковыми или целочисленными значениями для облегчения сериализации:
enum CardSuit : string { case Hearts = 'H' ; case Diamonds = 'D' ; case Clubs = 'C' ; case Spades = 'S' ; }
Интерфейс Enum'а предоставляет метод, который дает коллекцию своих перечислителей и их имен. Перечисления с поддержкой строк/целых чисел также предоставляют поддерживающее значение и методы для (попытки) десериализации. Пользователи могут добавлять дополнительные методы.
Хотя Rust использует enum
ключевое слово, как и C, он использует его для описания помеченных объединений , перечисления которых можно считать вырожденной формой. Поэтому перечисления Rust гораздо более гибкие и могут содержать варианты структур и кортежей.
enum Message { Quit , Move { x : i32 , y : i32 }, // struct Write ( String ), // кортеж из одного элемента ChangeColor ( i32 , i32 , i32 ), // кортеж из трех элементов }
Как и C, Rust также поддерживает указание значений каждого варианта,
#[allow(dead_code)] pub enum Будний день { Воскресенье = 1 , Понедельник = 2 , Вторник = 4 , Среда = 8 , Четверг = 16 , Пятница = 32 , Суббота = 64 , }
В C перечисления назначают связанные имена набору целочисленных значений. В Swift перечисления гораздо более гибкие и не должны предоставлять значение для каждого случая перечисления. Если значение (называемое необработанным значением) предоставляется для каждого случая перечисления, значение может быть строкой, символом или значением любого целочисленного или плавающего типа.
В качестве альтернативы, случаи перечисления могут указывать ассоциированные значения любого типа, которые будут храниться вместе с каждым другим значением случая, во многом как объединения или варианты делают в других языках. Можно определить общий набор связанных случаев как часть одного перечисления, каждое из которых имеет другой набор значений соответствующих типов, связанных с ним.
В Swift перечисления являются типом первого класса. Они принимают множество функций, традиционно поддерживаемых только классами, например, вычисляемые свойства для предоставления дополнительной информации о текущем значении перечисления и методы экземпляра для предоставления функциональности, связанной со значениями, которые представляет перечисление. Перечисления также могут определять инициализаторы для предоставления начального значения case и могут быть расширены для расширения их функциональности за пределы их первоначальной реализации; и могут соответствовать протоколам для предоставления стандартной функциональности.
enum CardSuit { case трефы case бубны case червы case пики }
В отличие от C и Objective-C , в Swift перечислениям не присваивается целочисленное значение по умолчанию при их создании. В примере CardSuit выше трефы, бубны, червы и пики не являются неявно равными 0, 1, 2 и 3. Вместо этого различные перечисления являются полноценными значениями сами по себе, с явно определенным типом CardSuit.
Несколько случаев могут быть указаны в одной строке и разделены запятыми:
enum CardSuit { case трефы , бубны , червы , пики }
При работе с перечислениями, хранящими целочисленные или строковые необработанные значения, нет необходимости явно назначать необработанное значение для каждого случая, поскольку Swift автоматически назначает значения.
Например, когда целые числа используются для необработанных значений, неявное значение для каждого случая на единицу больше, чем в предыдущем случае. Если для первого случая не установлено значение, его значение равно 0. Для примера CardSuit масти можно пронумеровать, начиная с 1, записав:
enum CardSuit { case трефы = 1 , бубны , червы , пики }
TypeScript добавляет тип данных «enum» в JavaScript.
enum Cardsuit { Трефы , Бубны , Червы , Пики } ; var c : Cardsuit = Cardsuit.Bubns ;
По умолчанию перечисления нумеруют элементы, начиная с 0; это можно переопределить, задав значение первого:
enum Cardsuit { Трефы = 1 , Бубны , Червы , Пики }; var c : Cardsuit = Карточная масть . Бубны ;
Все значения могут быть установлены:
enum Cardsuit { Трефы = 1 , Бубны = 2 , Червы = 4 , Пики = 8 }; var c : Cardsuit = Карточная масть . Бубны ;
TypeScript поддерживает сопоставление числового значения с его именем. Например, это находит имя значения 2:
enum Cardsuit { Трефы = 1 , Бубны , Червы , Пики }; var suitName : string = Cardsuit [ 2 ]; оповещение ( suitName );
Модуль enum был добавлен в стандартную библиотеку Python в версии 3.4.
из enum import Enum class Карты ( Enum ): ТРЕВЫ = 1 БУБИНЫ = 2 ЧЕРДЫ = 3 ПИКИ = 4
Также имеется функциональный API для создания перечислений с автоматически генерируемыми индексами (начиная с единицы):
Карты = Перечисление ( "Карты" , "ТРЕФЫ БУБИНЫ ЧЕРВЫ ПИКИ" )
Перечисления Python не обеспечивают семантическую корректность (бессмысленное сравнение с несовместимым перечислением всегда возвращает False, а не вызывает TypeError ):
>>> Цвет = Перечисление ( "Цвет" , "КРАСНЫЙ ЗЕЛЕНЫЙ СИНИЙ" ) >>> Форма = Перечисление ( "Форма" , [ "КРУГ" , "ТРЕУГОЛЬНИК" , " КВАДРАТ " , "ШЕСТИУГОЛЬНИК" ]) >>> def has_vertices ( форма ) : ... return форма ! = Форма.КРУГ ... >>> has_vertices ( Цвет.ЗЕЛЕНЫЙ ) Истина
Fortran имеет только перечислимые типы для взаимодействия с C; следовательно, семантика похожа на C и, как и в C, значения перечисления являются просто целыми числами, и дальнейшая проверка типа не выполняется. Пример C выше может быть записан на Fortran как
enum , bind ( C ) enumerator :: CLUBS = 1 , DIAMONDS = 2 , HEARTS = 4 , SPADES = 8 end enum
Перечисляемым типам данных в Visual Basic (до версии 6) и VBA автоматически присваивается Long
тип данных " ", и они также сами становятся типом данных:
'Zero-based Enum CardSuit Трефы Бубны Червы Пики End Enum Sub EnumExample () Dim suit As CardSuit масть = Бубны MsgBox масть End Sub
Пример кода на VB.NET
Enum CardSuit Трефы Бубны Червы Пики Конец Enum Sub EnumExample () Dim suit As CardSuit suit = CardSuit . Diamonds MessageBox . show ( suit ) End Sub
Common Lisp использует спецификатор типа члена, например,
( deftype cardsuit () ' ( member club diamond heart spade ))
который утверждает, что объект имеет тип cardsuit, если он является #'eql
клубом, бубном, червой или пикой. Однако спецификатор типа члена недопустим в качестве спецификатора параметров Common Lisp Object System (CLOS). Вместо этого может использоваться (eql atom)
, что эквивалентно (member atom)
(то есть только один член набора может быть указан с помощью спецификатора типа eql, однако его можно использовать в качестве спецификатора параметров CLOS.) Другими словами, чтобы определить методы для покрытия перечисляемого типа, необходимо определить метод для каждого конкретного элемента этого типа.
Кроме того,
( deftype конечно-элементный-тип-множества ( &rest elements ) ` ( member ,@ elements ))
может использоваться для определения произвольных перечислимых типов во время выполнения. Например
( конечно-элементный тип трефы алмаз сердце пика )
будет ссылаться на тип, эквивалентный предыдущему определению cardsuit, поскольку, конечно, просто использовалось бы
( член клуба алмаз сердце пика )
но может быть менее запутанным с функцией #'member
по стилистическим причинам.
Dart поддерживает самую базовую форму перечислений и имеет синтаксис, во многом схожий с синтаксисом других языков, поддерживающих перечисления.
перечисление CardSuite { Клубы , Бриллианты , Сердца , Пики}пустая основная () { Карта CardSuite = CardSuite . Трефы ; // Dart использует оператор «switch» для сопоставления значения перечисления с желаемым выводом. переключатель ( карта ) { кейс CardSuite . Клубы: { печать ( "Клубы" ); } перерыв ; кейс CardSuite . Алмазы: { печать ( "Бриллианты" ); } перерыв ; случай CardSuite . Сердца: { печать ( "Сердца" ); } перерыв ; случай CardSuite . Пики: { печать ( "Пики" ); } перерыв ; по умолчанию : { печать ( "Неизвестно" ); } перерыв ; }}
Обратите внимание, что оператор switch не гарантирует полноту случаев. Это означает, что если вы пропустите один случай, компилятор не выдаст ошибку.
В функциональных языках программирования в родословной ML (например, Standard ML (SML), OCaml и Haskell ) алгебраический тип данных с конструкторами только с нулевым числом может использоваться для реализации перечислимого типа. Например (в синтаксисе сигнатур SML):
тип данных карточная масть = Трефы | Бубны | Червы | Пики тип карта = { масть : карточная масть ; значение : целое } значение рука : список карт значение козырь : карточная масть
В этих языках представление малых целых чисел полностью скрыто от программиста, если такое представление действительно используется реализацией. Однако в 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= "Кресты" /> <xs:enumeration value= "Бубны" /> <xs:enumeration value= "Червы" /> <xs:enumeration value= "Пики" /> </xs:restriction> </xs:simpleType> </xs:element>
В Java перечислимые типы являются полноценным классом, что означает, что они типобезопасны и могут быть расширены путем добавления методов, полей или даже реализации интерфейсов. Тогда как в C# перечислимый тип — это просто синтаксический сахар вокруг целочисленного типа (обычно int), что означает, что они не могут быть расширены и не являются типобезопасными.
{{cite web}}
: CS1 maint: bot: original URL status unknown (link)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: multiple names: authors list (link)Альтернативный URL-адрес Архивировано 27.05.2013 на Wayback Machine// Плохо спроектированный enum не делает этого … Очевидно (как и со всем остальным), мы можем неправильно использовать этот кусочек сахара, что приведет к тому, что система будет страдать от гипергликемии. … Поскольку базовым типом нашего enum является int (также можно использовать другие целочисленные типы), это может привести к некоторым интересным проблемам при использовании enum в качестве битовых флагов с помощью побитовых операторов.
{{cite web}}
: CS1 maint: bot: original URL status unknown (link)