fbpx
Wikipedia

Enumerated type

In computer programming, an enumerated type (also called enumeration, enum, or factor in the R programming language, and a categorical variable in statistics) is a data type consisting of a set of named values called elements, members, enumeral, or enumerators of the type. The enumerator names are usually identifiers that behave as constants in the language. An enumerated type can be seen as a degenerate tagged union of unit type. A variable that has been declared as having an enumerated type can be assigned any of the enumerators as a value. In other words, an enumerated type has values that are different from each other, and that can be compared and assigned, but are not specified by the programmer as having any particular concrete representation in the computer's memory; compilers and interpreters can represent them arbitrarily.

For example, the four suits in a deck of playing cards may be four enumerators named Club, Diamond, Heart, and Spade, belonging to an enumerated type named suit. If a variable V is declared having suit as its data type, one can assign any of those four values to it.

Although the enumerators are usually distinct, some languages may allow the same enumerator to be listed twice in the type's declaration. The names of enumerators need not be semantically complete or compatible in any sense. For example, an enumerated type called color may be defined to consist of the enumerators Red, Green, Zebra, Missing, and Bacon. In some languages, the declaration of an enumerated type also intentionally defines an ordering of its members (High, Medium and Low priorities); in others, the enumerators are unordered (English, French, German and Spanish supported languages); in others still, an implicit ordering arises from the compiler concretely representing enumerators as integers.

Some enumerator types may be built into the language. The Boolean type, for example is often a pre-defined enumeration of the values False and True. A unit type consisting of a single value may also be defined to represent null. Many languages allow users to define new enumerated types.

Values and variables of an enumerated type are usually implemented with some integer type as the underlying representation. Some languages, especially system programming languages, allow the user to specify the bit combination to be used for each enumerator, which can be useful to efficiently represent sets of enumerators as fixed-length bit strings. In type theory, enumerated types are often regarded as tagged unions of unit types. Since such types are of the form , they may also be written as natural numbers.

Rationale Edit

Some early programming languages did not originally have enumerated types. If a programmer wanted a variable, for example myColor, to have a value of red, the variable red would be declared and assigned some arbitrary value, usually an integer constant. The variable red would then be assigned to myColor. Other techniques assigned arbitrary values to strings containing the names of the enumerators.

These arbitrary values were sometimes referred to as magic numbers since there often was no explanation as to how the numbers were obtained or whether their actual values were significant. These magic numbers could make the source code harder for others to understand and maintain.

Enumerated types, on the other hand, make the code more self-documenting. Depending on the language, the compiler could automatically assign default values to the enumerators thereby hiding unnecessary detail from the programmer. These values may not even be visible to the programmer (see information hiding). Enumerated types can also prevent a programmer from writing illogical code such as performing mathematical operations on the values of the enumerators. If the value of a variable that was assigned an enumerator were to be printed, some programming languages could also print the name of the enumerator rather than its underlying numerical value. A further advantage is that enumerated types can allow compilers to enforce semantic correctness. For instance: myColor = TRIANGLE can be forbidden, whilst myColor = RED is accepted, even if TRIANGLE and RED are both internally represented as 1.

Conceptually, an enumerated type is similar to a list of nominals (numeric codes), since each possible value of the type is assigned a distinctive natural number. A given enumerated type is thus a concrete implementation of this notion. When order is meaningful and/or used for comparison, then an enumerated type becomes an ordinal type.

Conventions Edit

Programming languages tend to have their own, oftentimes multiple, programming styles and naming conventions. The variable assigned to an enumeration is usually a noun in singular form, and frequently follows either a PascalCase or uppercase convention, while lowercase and others are seen less frequently.

Syntax in several programming languages Edit

Pascal and syntactically similar languages Edit

Pascal Edit

In Pascal, an enumerated type can be implicitly declared by listing the values in a parenthesised list:

 var  suit: (clubs, diamonds, hearts, spades); 

The declaration will often appear in a type synonym declaration, such that it can be used for multiple variables:

 type  cardsuit = (clubs, diamonds, hearts, spades);  card = record  suit: cardsuit;  value: 1 .. 13;  end;  var  hand: array [ 1 .. 13 ] of card;  trump: cardsuit; 

The order in which the enumeration values are given matters. An enumerated type is an ordinal type, and the pred and succ functions will give the prior or next value of the enumeration, and ord can convert enumeration values to their integer representation. Standard Pascal does not offer a conversion from arithmetic types to enumerations, however. Extended Pascal offers this functionality via an extended succ function. Some other Pascal dialects allow it via type-casts. Some modern descendants of Pascal, such as Modula-3, provide a special conversion syntax using a method called VAL; Modula-3 also treats BOOLEAN and CHAR as special pre-defined enumerated types and uses ORD and VAL for standard ASCII decoding and encoding.

Pascal style languages also allow enumeration to be used as array index:

 var  suitcount: array [cardsuit] of integer; 

Ada Edit

In Ada, the use of "=" was replaced with "is" leaving the definition quite similar:

type Cardsuit is (clubs, diamonds, hearts, spades); 

In addition to Pred, Succ, Val and Pos Ada also supports simple string conversions via Image and Value.

Similar to C-style languages Ada allows the internal representation of the enumeration to be specified:

for Cardsuit use (clubs => 1, diamonds => 2, hearts => 4, spades => 8); 

Unlike C-style languages Ada also allows the number of bits of the enumeration to be specified:

for Cardsuit'Size use 4; -- 4 bits 

Additionally, one can use enumerations as indexes for arrays, like in Pascal, but there are attributes defined for enumerations

 Shuffle : constant array(Cardsuit) of Cardsuit := (Clubs => Cardsuit'Succ(Clubs), -- see attributes of enumerations 'First, 'Last, 'Succ, 'Pred Diamonds => Hearts, --an explicit value Hearts => Cardsuit'Last, --first enumeration value of type Cardsuit e.g., clubs Spades => Cardsuit'First --last enumeration value of type Cardsuit e.g., spades ); 

Like Modula-3 Ada treats Boolean and Character as special pre-defined (in package "Standard") enumerated types. Unlike Modula-3 one can also define own character types:

type Cards is ('7', '8', '9', 'J', 'Q', 'K', 'A'); 

C and syntactically similar languages Edit

C Edit

The original K&R dialect of the programming language C had no enumerated types.[1] In C, enumerations are created by explicit definitions (the enum keyword by itself does not cause allocation of storage) which use the enum keyword and are reminiscent of struct and union definitions:

enum cardsuit {  Clubs,  Diamonds,  Hearts,  Spades }; struct card {  enum cardsuit suit;  short int value; } hand[13]; enum cardsuit trump; 

C exposes the integer representation of enumeration values directly to the programmer. Integers and enum values can be mixed freely, and all arithmetic operations on enum values are permitted. It is even possible for an enum variable to hold an integer that does not represent any of the enumeration values. In fact, according to the language definition, the above code will define Clubs, Diamonds, Hearts, and Spades as constants of type int, which will only be converted (silently) to enum cardsuit if they are stored in a variable of that type.

C also allows the programmer to choose the values of the enumeration constants explicitly, even without type. For example,

enum cardsuit {  Clubs = 1,  Diamonds = 2,  Hearts = 4,  Spades = 8 }; 

could be used to define a type that allows mathematical sets of suits to be represented as an enum cardsuit by bitwise logic operations.

Since C23, the underlying type of an enumeration can be specified by the programmer:[2]

enum cardsuit : char {  Clubs = 1,  Diamonds = 2,  Hearts = 4,  Spades = 8 }; 

C# Edit

Enumerated types in the C# programming language preserve most of the "small integer" semantics of C's enums. Some arithmetic operations are not defined for enums, but an enum value can be explicitly converted to an integer and back again, and an enum variable can have values that were not declared by the enum definition. For example, given

enum Cardsuit {  Clubs,  Diamonds,  Spades,  Hearts } 

the expressions CardSuit.Diamonds + 1 and CardSuit.Hearts - CardSuit.Clubs are allowed directly (because it may make sense to step through the sequence of values or ask how many steps there are between two values), but CardSuit.Hearts * CardSuit.Spades is deemed to make less sense and is only allowed if the values are first converted to integers.

C# also provides the C-like feature of being able to define specific integer values for enumerations. By doing this it is possible to perform binary operations on enumerations, thus treating enumeration values as sets of flags. These flags can be tested using binary operations or with the Enum type's builtin 'HasFlag' method.

The enumeration definition defines names for the selected integer values and is syntactic sugar, as it is possible to assign to an enum variable other integer values that are not in the scope of the enum definition.[3][4][5]

C++ Edit

C++ has enumeration types that are directly inherited from C's and work mostly like these, except that an enumeration is a real type in C++, giving added compile-time checking. Also (as with structs), the C++ enum keyword is combined with a typedef, so that instead of naming the type enum name, simply name it name. This can be simulated in C using a typedef: typedef enum {Value1, Value2} name;

C++11 also provides a second kind of enumeration, called a scoped enumeration. These are type-safe: the enumerators are not implicitly converted to an integer type. Among other things, this allows I/O streaming to be defined for the enumeration type. Another feature of scoped enumerations is that the enumerators do not leak, so usage requires prefixing with the name of the enumeration (e.g., Color::Red for the first enumerator in the example below), unless a using enum declaration (introduced in C++20) has been used to bring the enumerators into the current scope. A scoped enumeration is specified by the phrase enum class (or enum struct). For example:

enum class Color {Red, Green, Blue}; 

The underlying type of an enumeration is an implementation-defined integral type that is large enough to hold all enumerated values; it does not have to be the smallest possible type. The underlying type can be specified directly, which allows "forward declarations" of enumerations:

enum class Color : long {Red, Green, Blue}; // must fit in size and memory layout the type 'long' enum class Shapes : char; // forward declaration. If later there are values defined that don't fit in 'char' it is an error. 

Go Edit

Go uses the iota keyword to create enumerated constants.[6]

type ByteSize float64 const (  _ = iota // ignore first value by assigning to blank identifier  KB ByteSize = 1 << (10 * iota)  MB  GB ) 

Haxe Edit

Enumerated types are an important feature of the language; they can have type parameters and be recursive.[7] They provide basic support for algebraic data types, allowing the inclusion of product types, in a fashion similar to Haskell and ML. A switch expression can apply pattern matching to an enum value, allowing for elegant solutions to complex programming problems:

enum Color {  red;  green;  blue;  rgb(r:Int, g:Int, b:Int); } class Colors {  static function 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;  }  }  static function validCalls() {  var redint = toInt(Color.red);  var rgbint = toInt(Color.rgb(100, 100, 100));  } } 

Examples of parametric enum types are the Haxe standard library types Option[8] and Either:[9]

enum Option<T> {  Some(v:T);  None; } enum Either<L, R> {  Left(v:L);  Right(v:R); } 
Haxe also supports generalized algebraic data types (GADTs).[10][11]

Java Edit

 
A UML class diagram featuring a enum.

The J2SE version 5.0 of the Java programming language added enumerated types whose declaration syntax is similar to that of C:

enum Cardsuit { CLUBS, DIAMONDS, SPADES, HEARTS }; ... Cardsuit trump; 

The Java type system, however, treats enumerations as a type separate from integers, and intermixing of enum and integer values is not allowed. In fact, an enum type in Java is actually a special compiler-generated class rather than an arithmetic type, and enum values behave as global pre-generated instances of that class. Enum types can have instance methods and a constructor (the arguments of which can be specified separately for each enum value). All enum types implicitly extend the Enum abstract class. An enum type cannot be instantiated directly.[12]

Internally, each enum value contains an integer, corresponding to the order in which they are declared in the source code, starting from 0. The programmer cannot set a custom integer for an enum value directly, but one can define overloaded constructors that can then assign arbitrary values to self-defined members of the enum class. Defining getters allows then access to those self-defined members. The internal integer can be obtained from an enum value using the ordinal() method, and the list of enum values of an enumeration type can be obtained in order using the values() method. It is generally discouraged for programmers to convert enums to integers and vice versa.[13] Enumerated types are Comparable, using the internal integer; as a result, they can be sorted.

The Java standard library provides utility classes to use with enumerations. The EnumSet class implements a Set of enum values; it is implemented as a bit array, which makes it very compact and as efficient as explicit bit manipulation, but safer. The EnumMap class implements a Map of enum values to object. It is implemented as an array, with the integer value of the enum value serving as the index.

Perl Edit

Dynamically typed languages in the syntactic tradition of C (e.g., Perl or JavaScript) do not, in general, provide enumerations. But in Perl programming the same result can be obtained with the shorthand strings list and hashes (possibly slices):

my @enum = qw(Clubs Diamonds Hearts Spades); my( %set1, %set2 ); @set1{@enum} = (); # all cleared @set2{@enum} = (1) x @enum; # all set to 1 $set1{Clubs} ... # false $set2{Diamonds} ... # true 

Raku Edit

Raku (formerly known as Perl 6) supports enumerations. There are multiple ways to declare enumerations in Raku, all creating a back-end Map.

enum Cat <sphynx siamese bengal shorthair other>; # Using "quote-words" 
enum Cat ('sphynx', 'siamese', 'bengal', 'shorthair', 'other'); # Using a list 
enum Cat (sphynx => 0, siamese => 1, bengal => 2, shorthair => 3, other => 4); # Using Pair constructors 
enum Cat (:sphynx(0), :siamese(1), :bengal(2), shorthair(3), :other(4)); # Another way of using Pairs, you can also use `:0sphynx` 

PHP Edit

Enums were added in PHP version 8.1.

enum CardSuit { case Hearts; case Diamonds; case Clubs; case Spades; } 

Enumerators may be backed by string or integer values to aid serialization:

enum CardSuit: string { case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; } 

The Enum's interface exposes a method that gives a collection of its enumerators and their names. String/integer-backed Enums also expose the backing value and methods to (attempt) deserialization. Users may add further methods.

Rust Edit

Though Rust uses the enum keyword like C, it uses it to describe tagged unions, which enums can be considered a degenerate form of. Rust's enums are therefore much more flexible and can contain struct and tuple variants.

enum Message {  Quit,  Move { x: i32, y: i32 }, // struct  Write(String), // single-element tuple  ChangeColor(i32, i32, i32), // three-element tuple } 

Swift Edit

In C, enumerations assign related names to a set of integer values. In Swift, enumerations are much more flexible and need not provide a value for each case of the enumeration. If a value (termed a raw value) is provided for each enumeration case, the value can be a string, a character, or a value of any integer or floating-point type.

Alternatively, enumeration cases can specify associated values of any type to be stored along with each different case value, much as unions or variants do in other languages. One can define a common set of related cases as part of one enumeration, each of which has a different set of values of appropriate types associated with it.

In Swift, enumerations are a first-class type. They adopt many features traditionally supported only by classes, such as computed properties to provide additional information about the enumeration's current value, and instance methods to provide functionality related to the values the enumeration represents. Enumerations can also define initializers to provide an initial case value and can be extended to expand their functionality beyond their original implementation; and can conform to protocols to provide standard functionality.

enum CardSuit { case clubs case diamonds case hearts case spades } 

Unlike C and Objective-C, Swift enumeration cases are not assigned a default integer value when they are created. In the CardSuit example above, clubs, diamonds, hearts, and spades do not implicitly equal 0, 1, 2 and 3. Instead, the different enumeration cases are fully-fledged values in their own right, with an explicitly-defined type of CardSuit.

Multiple cases can appear on a single line, separated by commas:

enum CardSuit { case clubs, diamonds, hearts, spades } 

When working with enumerations that store integer or string raw values, one doesn't need to explicitly assign a raw value for each case because Swift will automatically assign the values.

For instance, when integers are used for raw values, the implicit value for each case is one more than the previous case. If the first case doesn't have a value set, its value is 0. For the CardSuit example, suits can be numbered starting from 1 by writing:

enum CardSuit { case clubs = 1, diamonds, hearts, spades } 

TypeScript Edit

TypeScript adds an 'enum' data type to JavaScript.

enum Cardsuit {Clubs, Diamonds, Hearts, Spades}; var c: Cardsuit = Cardsuit.Diamonds; 

By default, enums number members starting at 0; this can be overridden by setting the value of the first:

enum Cardsuit {Clubs = 1, Diamonds, Hearts, Spades}; var c: Cardsuit = Cardsuit.Diamonds; 

All the values can be set:

enum Cardsuit {Clubs = 1, Diamonds = 2, Hearts = 4, Spades = 8}; var c: Cardsuit = Cardsuit.Diamonds; 

TypeScript supports mapping the numeric value to its name. For example, this finds the name of the value 2:

enum Cardsuit {Clubs = 1, Diamonds, Hearts, Spades}; var suitName: string = Cardsuit[2]; alert(suitName); 

Python Edit

An enum module was added to the Python standard library in version 3.4.

from enum import Enum class Cards(Enum): CLUBS = 1 DIAMONDS = 2 HEARTS = 3 SPADES = 4 

There is also a functional API for creating enumerations with automatically generated indices (starting with one):

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

Python enumerations do not enforce semantic correctness (a meaningless comparison to an incompatible enumeration always returns False rather than raising a TypeError):

>>> Color = Enum("Color", "RED GREEN BLUE") >>> Shape = Enum("Shape", ["CIRCLE", "TRIANGLE", "SQUARE", "HEXAGON"]) >>> def has_vertices(shape): ...  return shape != Shape.CIRCLE ... >>> has_vertices(Color.GREEN) True 

Fortran Edit

Fortran only has enumerated types for interoperability with C; hence, the semantics is similar to C and, as in C, the enum values are just integers and no further type check is done. The C example from above can be written in Fortran as

enum, bind( C )  enumerator :: CLUBS = 1, DIAMONDS = 2, HEARTS = 4, SPADES = 8 end enum 

Visual Basic/VBA Edit

Enumerated datatypes in Visual Basic (up to version 6) and VBA are automatically assigned the "Long" datatype and also become a datatype themselves:

'Zero-based Enum CardSuit  Clubs  Diamonds  Hearts  Spades End Enum Sub EnumExample()  Dim suit As CardSuit  suit = Diamonds  MsgBox suit End Sub 

Example Code in VB.NET

Enum CardSuit  Clubs  Diamonds  Hearts  Spades End Enum Sub EnumExample()  Dim suit As CardSuit  suit = CardSuit.Diamonds  MessageBox.show(suit) End Sub 

Lisp Edit

Common Lisp uses the member type specifier, e.g.,

(deftype cardsuit ()  '(member club diamond heart spade)) 

that states that object is of type cardsuit if it is #'eql to club, diamond, heart or spade. The member type specifier is not valid as a Common Lisp Object System (CLOS) parameter specializer, however. Instead, (eql atom), which is the equivalent to (member atom) may be used (that is, only one member of the set may be specified with an eql type specifier, however, it may be used as a CLOS parameter specializer.) In other words, to define methods to cover an enumerated type, a method must be defined for each specific element of that type.

Additionally,

(deftype finite-element-set-type (&rest elements)  `(member ,@elements)) 

may be used to define arbitrary enumerated types at runtime. For instance

(finite-element-set-type club diamond heart spade) 

would refer to a type equivalent to the prior definition of cardsuit, as of course would simply have been using

(member club diamond heart spade) 

but may be less confusing with the function #'member for stylistic reasons.

Dart Edit

Dart has a support for the most basic form of enums and has a syntax that is a lot similar with other languages supporting enums.

enum CardSuite {  Clubs,  Diamonds,  Hearts,  Spades }  void main() {  CardSuite card = CardSuite.Clubs;   // Dart uses the "switch" operator to match the value of an enum with the desired output.  switch (card) {  case CardSuite.Clubs: {  print("Clubs");  }  break;   case CardSuite.Diamonds: {  print("Diamonds");  }  break;   case CardSuite.Hearts: {  print("Hearts");  }  break;   case CardSuite.Spades: {  print("Spades");  }  break;   default: {  print("Unknown");  }  break;  } } 

Note that the switch operator does not guarantee the completeness of the cases. This means if you omit one case, the compiler will not raise an error.

Algebraic data type in functional programming Edit

In functional programming languages in the ML lineage (e.g., Standard ML (SML), OCaml, and Haskell), an algebraic data type with only nullary constructors can be used to implement an enumerated type. For example (in the syntax of SML signatures):

datatype cardsuit = Clubs | Diamonds | Hearts | Spades type card = { suit: cardsuit; value: int } val hand : card list val trump : cardsuit 

In these languages the small-integer representation is completely hidden from the programmer, if indeed such a representation is employed by the implementation. However, Haskell has the Enum type class which a type can derive or implement to get a mapping between the type and Int.

Databases Edit

Some databases support enumerated types directly. MySQL provides an enumerated type ENUM with allowable values specified as strings when a table is created. The values are stored as numeric indices with the empty string stored as 0, the first string value stored as 1, the second string value stored as 2, etc. Values can be stored and retrieved as numeric indexes or string values.[14]

Example:

CREATE TABLE shirts (  name VARCHAR(40),  size ENUM('x-small', 'small', 'medium', 'large', 'x-large') ); 

XML Schema Edit

XML Schema supports enumerated types through the enumeration facet used for constraining most primitive datatypes such as strings.

<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> 

See also Edit

References Edit

  1. ^ Kernighan, Brian W.; Ritchie, Dennis M. (February 1978). The C Programming Language (1st ed.). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3.
  2. ^ "WG14-N3030 : Enhancements to Enumerations". 2022-07-19.
  3. ^ Obasanjo, Dare (2007). . Archived from the original on 2012-09-10. Retrieved 2012-09-06. In Java, enumerated types are a full fledged class which means they are typesafe and can be extended by adding methods, fields or even implementing interfaces. Whereas in C#, an enumerated type is simply syntactic sugar around an integral type (typically an int) meaning they cannot be extended and are not typesafe.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  4. ^ Gruntz, Dominik, Prof. Dr. (2005-04-08). (in German). Fachhochschule Aargau, Nordwestschweiz. Archived from the original on 2007-01-07. Retrieved 2012-09-10. Enumerationen sind die heimlichen Sieger von Java 1.5. Nach vielen Beteuerungen durch Sun, Enums seien in 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++ und C# kann man ihnen per Gleichheitszeichen keine ganzen Zahlen zuordnen.{{cite web}}: CS1 maint: multiple names: authors list (link) Alt URL 2013-05-27 at the Wayback Machine
  5. ^ Truter, Christoff (2011-08-04). . CSTrüter. Archived from the original on 2007-01-07. Retrieved 2012-09-10. // Poorly designed enum don't do this … Obviously (like with everything else), we can misuse this piece of sugar ending up with a system suffering from hyperglycemia. … Seeing as the underlying type of our enum is an int (can also use other integral types) it can lead to some interesting issues when using an enum as bit flags via bitwise operators.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  6. ^ "Effective Go". golang.org. The Go Authors. Retrieved 2014-05-13.
  7. ^ . Archived from the original on 2012-05-11.
  8. ^ "haxe/Option.hx at development · HaxeFoundation/haxe". Github. 7 November 2021.
  9. ^ "haxe/Either.hx at development · HaxeFoundation/haxe". Github. 7 November 2021.
  10. ^ "Language Features". Haxe - The Cross-platform Toolkit. Haxe Foundation. Retrieved 30 April 2015.
  11. ^ "haxe/TestGADT.hx at development · HaxeFoundation/haxe". Github. 7 November 2021.
  12. ^ "Enum Types". Oracle. Retrieved 2013-12-05.
  13. ^ Bloch, Joshua (2008). Effective Java (Second ed.). Upper Saddle River, N.J.: Addison-Wesley. p. 158. ISBN 978-0-321-35668-0.
  14. ^ "MySQL :: MySQL 8.0 Reference Manual :: 11.3.5 The ENUM Type". dev.mysql.com. Retrieved 19 September 2021.

External links Edit

  • Enumerated types in C/C++
  • Enumerated types in C#
  • Enumerated types in Java
  • Enumerated types in MySQL
  • Enumerated types in Obix
  • Enumerated types in PHP
  • Enumerated types in Swift
  • Enumerated types in XML
  • Enumerated types in Visual Basic

enumerated, type, computer, programming, enumerated, type, also, called, enumeration, enum, factor, programming, language, categorical, variable, statistics, data, type, consisting, named, values, called, elements, members, enumeral, enumerators, type, enumera. In computer programming an enumerated type also called enumeration enum or factor in the R programming language and a categorical variable in statistics is a data type consisting of a set of named values called elements members enumeral or enumerators of the type The enumerator names are usually identifiers that behave as constants in the language An enumerated type can be seen as a degenerate tagged union of unit type A variable that has been declared as having an enumerated type can be assigned any of the enumerators as a value In other words an enumerated type has values that are different from each other and that can be compared and assigned but are not specified by the programmer as having any particular concrete representation in the computer s memory compilers and interpreters can represent them arbitrarily For example the four suits in a deck of playing cards may be four enumerators named Club Diamond Heart and Spade belonging to an enumerated type named suit If a variable V is declared having suit as its data type one can assign any of those four values to it Although the enumerators are usually distinct some languages may allow the same enumerator to be listed twice in the type s declaration The names of enumerators need not be semantically complete or compatible in any sense For example an enumerated type called color may be defined to consist of the enumerators Red Green Zebra Missing and Bacon In some languages the declaration of an enumerated type also intentionally defines an ordering of its members High Medium and Low priorities in others the enumerators are unordered English French German and Spanish supported languages in others still an implicit ordering arises from the compiler concretely representing enumerators as integers Some enumerator types may be built into the language The Boolean type for example is often a pre defined enumeration of the values False and True A unit type consisting of a single value may also be defined to represent null Many languages allow users to define new enumerated types Values and variables of an enumerated type are usually implemented with some integer type as the underlying representation Some languages especially system programming languages allow the user to specify the bit combination to be used for each enumerator which can be useful to efficiently represent sets of enumerators as fixed length bit strings In type theory enumerated types are often regarded as tagged unions of unit types Since such types are of the form 1 1 1 displaystyle 1 1 cdots 1 they may also be written as natural numbers Contents 1 Rationale 2 Conventions 3 Syntax in several programming languages 3 1 Pascal and syntactically similar languages 3 1 1 Pascal 3 1 2 Ada 3 2 C and syntactically similar languages 3 2 1 C 3 2 2 C 3 2 3 C 3 2 4 Go 3 2 5 Haxe 3 2 6 Java 3 2 7 Perl 3 2 8 Raku 3 2 9 PHP 3 2 10 Rust 3 2 11 Swift 3 2 12 TypeScript 3 2 13 Python 3 2 14 Fortran 3 2 15 Visual Basic VBA 3 2 16 Lisp 3 2 17 Dart 4 Algebraic data type in functional programming 5 Databases 6 XML Schema 7 See also 8 References 9 External linksRationale EditSome early programming languages did not originally have enumerated types If a programmer wanted a variable for example myColor to have a value of red the variable red would be declared and assigned some arbitrary value usually an integer constant The variable red would then be assigned to myColor Other techniques assigned arbitrary values to strings containing the names of the enumerators These arbitrary values were sometimes referred to as magic numbers since there often was no explanation as to how the numbers were obtained or whether their actual values were significant These magic numbers could make the source code harder for others to understand and maintain Enumerated types on the other hand make the code more self documenting Depending on the language the compiler could automatically assign default values to the enumerators thereby hiding unnecessary detail from the programmer These values may not even be visible to the programmer see information hiding Enumerated types can also prevent a programmer from writing illogical code such as performing mathematical operations on the values of the enumerators If the value of a variable that was assigned an enumerator were to be printed some programming languages could also print the name of the enumerator rather than its underlying numerical value A further advantage is that enumerated types can allow compilers to enforce semantic correctness For instance myColor TRIANGLE can be forbidden whilst myColor RED is accepted even if TRIANGLE and RED are both internally represented as 1 Conceptually an enumerated type is similar to a list of nominals numeric codes since each possible value of the type is assigned a distinctive natural number A given enumerated type is thus a concrete implementation of this notion When order is meaningful and or used for comparison then an enumerated type becomes an ordinal type Conventions EditProgramming languages tend to have their own oftentimes multiple programming styles and naming conventions The variable assigned to an enumeration is usually a noun in singular form and frequently follows either a PascalCase or uppercase convention while lowercase and others are seen less frequently Syntax in several programming languages EditPascal and syntactically similar languages Edit Pascal Edit In Pascal an enumerated type can be implicitly declared by listing the values in a parenthesised list var suit clubs diamonds hearts spades The declaration will often appear in a type synonym declaration such that it can be used for multiple variables type cardsuit clubs diamonds hearts spades card record suit cardsuit value 1 13 end var hand array 1 13 of card trump cardsuit The order in which the enumeration values are given matters An enumerated type is an ordinal type and the pred and succ functions will give the prior or next value of the enumeration and ord can convert enumeration values to their integer representation Standard Pascal does not offer a conversion from arithmetic types to enumerations however Extended Pascal offers this functionality via an extended succ function Some other Pascal dialects allow it via type casts Some modern descendants of Pascal such as Modula 3 provide a special conversion syntax using a method called VAL Modula 3 also treats BOOLEAN and CHAR as special pre defined enumerated types and uses ORD and VAL for standard ASCII decoding and encoding Pascal style languages also allow enumeration to be used as array index var suitcount array cardsuit of integer Ada Edit In Ada the use of was replaced with is leaving the definition quite similar type Cardsuit is clubs diamonds hearts spades In addition to Pred Succ Val and Pos Ada also supports simple string conversions via Image and Value Similar to C style languages Ada allows the internal representation of the enumeration to be specified for Cardsuit use clubs gt 1 diamonds gt 2 hearts gt 4 spades gt 8 Unlike C style languages Ada also allows the number of bits of the enumeration to be specified for Cardsuit Size use 4 4 bits Additionally one can use enumerations as indexes for arrays like in Pascal but there are attributes defined for enumerations Shuffle constant array Cardsuit of Cardsuit Clubs gt Cardsuit Succ Clubs see attributes of enumerations First Last Succ Pred Diamonds gt Hearts an explicit value Hearts gt Cardsuit Last first enumeration value of type Cardsuit e g clubs Spades gt Cardsuit First last enumeration value of type Cardsuit e g spades Like Modula 3 Ada treats Boolean and Character as special pre defined in package Standard enumerated types Unlike Modula 3 one can also define own character types type Cards is 7 8 9 J Q K A C and syntactically similar languages Edit C Edit The original K amp R dialect of the programming language C had no enumerated types 1 In C enumerations are created by explicit definitions the enum keyword by itself does not cause allocation of storage which use the enum keyword and are reminiscent of struct and union definitions enum cardsuit Clubs Diamonds Hearts Spades struct card enum cardsuit suit short int value hand 13 enum cardsuit trump C exposes the integer representation of enumeration values directly to the programmer Integers and enum values can be mixed freely and all arithmetic operations on enum values are permitted It is even possible for an enum variable to hold an integer that does not represent any of the enumeration values In fact according to the language definition the above code will define Clubs Diamonds Hearts and Spades as constants of type int which will only be converted silently to enum cardsuit if they are stored in a variable of that type C also allows the programmer to choose the values of the enumeration constants explicitly even without type For example enum cardsuit Clubs 1 Diamonds 2 Hearts 4 Spades 8 could be used to define a type that allows mathematical sets of suits to be represented as an enum cardsuit by bitwise logic operations Since C23 the underlying type of an enumeration can be specified by the programmer 2 enum cardsuit char Clubs 1 Diamonds 2 Hearts 4 Spades 8 C Edit Enumerated types in the C programming language preserve most of the small integer semantics of C s enums Some arithmetic operations are not defined for enums but an enum value can be explicitly converted to an integer and back again and an enum variable can have values that were not declared by the enum definition For example given enum Cardsuit Clubs Diamonds Spades Hearts the expressions CardSuit Diamonds 1 and CardSuit Hearts CardSuit Clubs are allowed directly because it may make sense to step through the sequence of values or ask how many steps there are between two values but CardSuit Hearts CardSuit Spades is deemed to make less sense and is only allowed if the values are first converted to integers C also provides the C like feature of being able to define specific integer values for enumerations By doing this it is possible to perform binary operations on enumerations thus treating enumeration values as sets of flags These flags can be tested using binary operations or with the Enum type s builtin HasFlag method The enumeration definition defines names for the selected integer values and is syntactic sugar as it is possible to assign to an enum variable other integer values that are not in the scope of the enum definition 3 4 5 C Edit C has enumeration types that are directly inherited from C s and work mostly like these except that an enumeration is a real type in C giving added compile time checking Also as with structs the C enum keyword is combined with a typedef so that instead of naming the type enum name simply name it name This can be simulated in C using a typedef span class k typedef span span class w span span class k enum span span class w span span class p span span class n Value1 span span class p span span class w span span class n Value2 span span class p span span class w span span class n name span span class p span C 11 also provides a second kind of enumeration called a scoped enumeration These are type safe the enumerators are not implicitly converted to an integer type Among other things this allows I O streaming to be defined for the enumeration type Another feature of scoped enumerations is that the enumerators do not leak so usage requires prefixing with the name of the enumeration e g Color Red for the first enumerator in the example below unless a using enum declaration introduced in C 20 has been used to bring the enumerators into the current scope A scoped enumeration is specified by the phrase enum class or enum struct For example enum class Color Red Green Blue The underlying type of an enumeration is an implementation defined integral type that is large enough to hold all enumerated values it does not have to be the smallest possible type The underlying type can be specified directly which allows forward declarations of enumerations enum class Color long Red Green Blue must fit in size and memory layout the type long enum class Shapes char forward declaration If later there are values defined that don t fit in char it is an error Go Edit Go uses the iota keyword to create enumerated constants 6 type ByteSize float64 const iota ignore first value by assigning to blank identifier KB ByteSize 1 lt lt 10 iota MB GB Haxe Edit This section is an excerpt from Haxe Enumerated types edit Enumerated types are an important feature of the language they can have type parameters and be recursive 7 They provide basic support for algebraic data types allowing the inclusion of product types in a fashion similar to Haskell and ML A switch expression can apply pattern matching to an enum value allowing for elegant solutions to complex programming problems enum Color red green blue rgb r Int g Int b Int class Colors static function toInt c Color Int return switch c case red 0xFF0000 case green 0x00FF00 case blue 0x0000FF case rgb r g b r lt lt 16 g lt lt 8 b static function validCalls var redint toInt Color red var rgbint toInt Color rgb 100 100 100 Examples of parametric enum types are the Haxe standard library types Option 8 and Either 9 enum Option lt T gt Some v T None enum Either lt L R gt Left v L Right v R Haxe also supports generalized algebraic data types GADTs 10 11 Java Edit nbsp A UML class diagram featuring a enum The J2SE version 5 0 of the Java programming language added enumerated types whose declaration syntax is similar to that of C enum Cardsuit CLUBS DIAMONDS SPADES HEARTS Cardsuit trump The Java type system however treats enumerations as a type separate from integers and intermixing of enum and integer values is not allowed In fact an enum type in Java is actually a special compiler generated class rather than an arithmetic type and enum values behave as global pre generated instances of that class Enum types can have instance methods and a constructor the arguments of which can be specified separately for each enum value All enum types implicitly extend the Enum abstract class An enum type cannot be instantiated directly 12 Internally each enum value contains an integer corresponding to the order in which they are declared in the source code starting from 0 The programmer cannot set a custom integer for an enum value directly but one can define overloaded constructors that can then assign arbitrary values to self defined members of the enum class Defining getters allows then access to those self defined members The internal integer can be obtained from an enum value using the ordinal method and the list of enum values of an enumeration type can be obtained in order using the values method It is generally discouraged for programmers to convert enums to integers and vice versa 13 Enumerated types are Comparable using the internal integer as a result they can be sorted The Java standard library provides utility classes to use with enumerations The EnumSet class implements a Set of enum values it is implemented as a bit array which makes it very compact and as efficient as explicit bit manipulation but safer The EnumMap class implements a Map of enum values to object It is implemented as an array with the integer value of the enum value serving as the index Perl Edit Dynamically typed languages in the syntactic tradition of C e g Perl or JavaScript do not in general provide enumerations But in Perl programming the same result can be obtained with the shorthand strings list and hashes possibly slices my enum qw Clubs Diamonds Hearts Spades my set1 set2 set1 enum all cleared set2 enum 1 x enum all set to 1 set1 Clubs false set2 Diamonds true Raku Edit Raku formerly known as Perl 6 supports enumerations There are multiple ways to declare enumerations in Raku all creating a back end Map enum Cat lt sphynx siamese bengal shorthair other gt Using quote words enum Cat sphynx siamese bengal shorthair other Using a list enum Cat sphynx gt 0 siamese gt 1 bengal gt 2 shorthair gt 3 other gt 4 Using Pair constructors enum Cat sphynx 0 siamese 1 bengal 2 shorthair 3 other 4 Another way of using Pairs you can also use 0sphynx PHP Edit Enums were added in PHP version 8 1 enum CardSuit case Hearts case Diamonds case Clubs case Spades Enumerators may be backed by string or integer values to aid serialization enum CardSuit string case Hearts H case Diamonds D case Clubs C case Spades S The Enum s interface exposes a method that gives a collection of its enumerators and their names String integer backed Enums also expose the backing value and methods to attempt deserialization Users may add further methods Rust Edit Though Rust uses the enum keyword like C it uses it to describe tagged unions which enums can be considered a degenerate form of Rust s enums are therefore much more flexible and can contain struct and tuple variants enum Message Quit Move x i32 y i32 struct Write String single element tuple ChangeColor i32 i32 i32 three element tuple Swift Edit In C enumerations assign related names to a set of integer values In Swift enumerations are much more flexible and need not provide a value for each case of the enumeration If a value termed a raw value is provided for each enumeration case the value can be a string a character or a value of any integer or floating point type Alternatively enumeration cases can specify associated values of any type to be stored along with each different case value much as unions or variants do in other languages One can define a common set of related cases as part of one enumeration each of which has a different set of values of appropriate types associated with it In Swift enumerations are a first class type They adopt many features traditionally supported only by classes such as computed properties to provide additional information about the enumeration s current value and instance methods to provide functionality related to the values the enumeration represents Enumerations can also define initializers to provide an initial case value and can be extended to expand their functionality beyond their original implementation and can conform to protocols to provide standard functionality enum CardSuit case clubs case diamonds case hearts case spades Unlike C and Objective C Swift enumeration cases are not assigned a default integer value when they are created In the CardSuit example above clubs diamonds hearts and spades do not implicitly equal 0 1 2 and 3 Instead the different enumeration cases are fully fledged values in their own right with an explicitly defined type of CardSuit Multiple cases can appear on a single line separated by commas enum CardSuit case clubs diamonds hearts spades When working with enumerations that store integer or string raw values one doesn t need to explicitly assign a raw value for each case because Swift will automatically assign the values For instance when integers are used for raw values the implicit value for each case is one more than the previous case If the first case doesn t have a value set its value is 0 For the CardSuit example suits can be numbered starting from 1 by writing enum CardSuit case clubs 1 diamonds hearts spades TypeScript Edit TypeScript adds an enum data type to JavaScript enum Cardsuit Clubs Diamonds Hearts Spades var c Cardsuit Cardsuit Diamonds By default enums number members starting at 0 this can be overridden by setting the value of the first enum Cardsuit Clubs 1 Diamonds Hearts Spades var c Cardsuit Cardsuit Diamonds All the values can be set enum Cardsuit Clubs 1 Diamonds 2 Hearts 4 Spades 8 var c Cardsuit Cardsuit Diamonds TypeScript supports mapping the numeric value to its name For example this finds the name of the value 2 enum Cardsuit Clubs 1 Diamonds Hearts Spades var suitName string Cardsuit 2 alert suitName Python EditAn enum module was added to the Python standard library in version 3 4 from enum import Enum class Cards Enum CLUBS 1 DIAMONDS 2 HEARTS 3 SPADES 4 There is also a functional API for creating enumerations with automatically generated indices starting with one Cards Enum Cards CLUBS DIAMONDS HEARTS SPADES Python enumerations do not enforce semantic correctness a meaningless comparison to an incompatible enumeration always returns False rather than raising a TypeError gt gt gt Color Enum Color RED GREEN BLUE gt gt gt Shape Enum Shape CIRCLE TRIANGLE SQUARE HEXAGON gt gt gt def has vertices shape return shape Shape CIRCLE gt gt gt has vertices Color GREEN True Fortran Edit Fortran only has enumerated types for interoperability with C hence the semantics is similar to C and as in C the enum values are just integers and no further type check is done The C example from above can be written in Fortran as enum bind C enumerator CLUBS 1 DIAMONDS 2 HEARTS 4 SPADES 8 end enum Visual Basic VBA Edit Enumerated datatypes in Visual Basic up to version 6 and VBA are automatically assigned the Long datatype and also become a datatype themselves Zero based Enum CardSuit Clubs Diamonds Hearts Spades End Enum Sub EnumExample Dim suit As CardSuit suit Diamonds MsgBox suit End Sub Example Code in VB NET Enum CardSuit Clubs Diamonds Hearts Spades End Enum Sub EnumExample Dim suit As CardSuit suit CardSuit Diamonds MessageBox show suit End Sub Lisp Edit Common Lisp uses the member type specifier e g deftype cardsuit member club diamond heart spade that states that object is of type cardsuit if it is eql to club diamond heart or spade The member type specifier is not valid as a Common Lisp Object System CLOS parameter specializer however Instead eql atom which is the equivalent to member atom may be used that is only one member of the set may be specified with an eql type specifier however it may be used as a CLOS parameter specializer In other words to define methods to cover an enumerated type a method must be defined for each specific element of that type Additionally deftype finite element set type amp rest elements member elements may be used to define arbitrary enumerated types at runtime For instance finite element set type club diamond heart spade would refer to a type equivalent to the prior definition of cardsuit as of course would simply have been using member club diamond heart spade but may be less confusing with the function member for stylistic reasons Dart Edit Dart has a support for the most basic form of enums and has a syntax that is a lot similar with other languages supporting enums enum CardSuite Clubs Diamonds Hearts Spades void main CardSuite card CardSuite Clubs Dart uses the switch operator to match the value of an enum with the desired output switch card case CardSuite Clubs print Clubs break case CardSuite Diamonds print Diamonds break case CardSuite Hearts print Hearts break case CardSuite Spades print Spades break default print Unknown break Note that the switch operator does not guarantee the completeness of the cases This means if you omit one case the compiler will not raise an error Algebraic data type in functional programming EditIn functional programming languages in the ML lineage e g Standard ML SML OCaml and Haskell an algebraic data type with only nullary constructors can be used to implement an enumerated type For example in the syntax of SML signatures datatype cardsuit Clubs Diamonds Hearts Spades type card suit cardsuit value int val hand card list val trump cardsuit In these languages the small integer representation is completely hidden from the programmer if indeed such a representation is employed by the implementation However Haskell has the Enum type class which a type can derive or implement to get a mapping between the type and Int Databases EditSome databases support enumerated types directly MySQL provides an enumerated type ENUM with allowable values specified as strings when a table is created The values are stored as numeric indices with the empty string stored as 0 the first string value stored as 1 the second string value stored as 2 etc Values can be stored and retrieved as numeric indexes or string values 14 Example CREATE TABLE shirts name VARCHAR 40 size ENUM x small small medium large x large XML Schema EditXML Schema supports enumerated types through the enumeration facet used for constraining most primitive datatypes such as strings lt xs element name cardsuit gt lt xs simpleType gt lt xs restriction base xs string gt lt xs enumeration value Clubs gt lt xs enumeration value Diamonds gt lt xs enumeration value Hearts gt lt xs enumeration value Spades gt lt xs restriction gt lt xs simpleType gt lt xs element gt See also EditContrast setReferences Edit Kernighan Brian W Ritchie Dennis M February 1978 The C Programming Language 1st ed Englewood Cliffs NJ Prentice Hall ISBN 0 13 110163 3 WG14 N3030 Enhancements to Enumerations 2022 07 19 Obasanjo Dare 2007 A Comparison of Microsoft s C Programming Language to Sun Microsystems Java Programming Language Archived from the original on 2012 09 10 Retrieved 2012 09 06 In Java enumerated types are a full fledged class which means they are typesafe and can be extended by adding methods fields or even implementing interfaces Whereas in C an enumerated type is simply syntactic sugar around an integral type typically an int meaning they cannot be extended and are not typesafe a href Template Cite web html title Template Cite web cite web a CS1 maint bot original URL status unknown link Gruntz Dominik Prof Dr 2005 04 08 Java 5 Taming the Tiger Syntactic Sugar in German Fachhochschule Aargau Nordwestschweiz Archived from the original on 2007 01 07 Retrieved 2012 09 10 Enumerationen sind die heimlichen Sieger von Java 1 5 Nach vielen Beteuerungen durch Sun Enums seien in Java uberflussig und konnen einfach nachgebildet werden wurden sie nun doch eingefuhrt Die einfachste Moglichkeit einer Enumeration der Jahreszeiten sieht wie folgt aus Das Schlusselwort enum steht fur eine spezielle Art von Klasse die eine Enumeration definiert Im Gegensatz zu anderen Programmiersprachen wie C C und C kann man ihnen per Gleichheitszeichen keine ganzen Zahlen zuordnen a href Template Cite web html title Template Cite web cite web a CS1 maint multiple names authors list link Alt URL Archived 2013 05 27 at the Wayback Machine Truter Christoff 2011 08 04 Syntactic sugar C Enum CSTruter Archived from the original on 2007 01 07 Retrieved 2012 09 10 Poorly designed enum don t do this Obviously like with everything else we can misuse this piece of sugar ending up with a system suffering from hyperglycemia Seeing as the underlying type of our enum is an int can also use other integral types it can lead to some interesting issues when using an enum as bit flags via bitwise operators a href Template Cite web html title Template Cite web cite web a CS1 maint bot original URL status unknown link Effective Go golang org The Go Authors Retrieved 2014 05 13 Haxe reference detailing the use of enum Archived from the original on 2012 05 11 haxe Option hx at development HaxeFoundation haxe Github 7 November 2021 haxe Either hx at development HaxeFoundation haxe Github 7 November 2021 Language Features Haxe The Cross platform Toolkit Haxe Foundation Retrieved 30 April 2015 haxe TestGADT hx at development HaxeFoundation haxe Github 7 November 2021 Enum Types Oracle Retrieved 2013 12 05 Bloch Joshua 2008 Effective Java Second ed Upper Saddle River N J Addison Wesley p 158 ISBN 978 0 321 35668 0 MySQL MySQL 8 0 Reference Manual 11 3 5 The ENUM Type dev mysql com Retrieved 19 September 2021 External links Edit nbsp The Wikibook Ada Programming has a page on the topic of Enumeration Enumerated types in C C Enumerated types in C Enumerated types in Java Enumerated types in MySQL Enumerated types in Obix Enumerated types in PHP Enumerated types in Swift Enumerated types in XML Enumerated types in Visual Basic Retrieved from https en wikipedia org w index php title Enumerated type amp oldid 1161478870, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.