En programación de computadoras , un tipo enumerado (también llamado enumeración , enumeración o factor en el lenguaje de programación R , y variable categórica en estadística) es un tipo de datos que consta de un conjunto de valores con nombre llamados elementos , miembros , enumeradores o enumeradores de el tipo. Los nombres de los enumeradores suelen ser identificadores que se comportan como constantes en el lenguaje. Un tipo enumerado puede verse como una unión etiquetada degenerada de tipo de unidad . A una variable que ha sido declarada como de tipo enumerado se le puede asignar cualquiera de los enumeradores como valor. En otras palabras, un tipo enumerado tiene valores que son diferentes entre sí y que se pueden comparar y asignar, pero el programador no especifica que tengan ninguna representación concreta en particular en la memoria de la computadora; los compiladores e intérpretes pueden representarlos arbitrariamente.
Por ejemplo, los cuatro palos de una baraja de naipes pueden ser cuatro enumeradores denominados Trébol , Diamante , Corazón y Espada , pertenecientes a un tipo enumerado denominado palo . Si se declara una variable V que tiene traje como tipo de datos, se le puede asignar cualquiera de esos cuatro valores.
Aunque los enumeradores suelen ser distintos, algunos idiomas pueden permitir que el mismo enumerador aparezca dos veces en la declaración del tipo. Los nombres de los enumeradores no necesitan ser semánticamente completos ni compatibles en ningún sentido. Por ejemplo, se puede definir un tipo enumerado llamado color para que esté formado por los enumeradores Red , Green , Zebra , Missing y Bacon . En algunos idiomas, la declaración de un tipo enumerado también define intencionalmente un orden de sus miembros ( prioridades Alta , Media y Baja ); en otros, los enumeradores están desordenados ( idiomas admitidos en inglés , francés , alemán y español ); en otros aún, surge un orden implícito cuando el compilador representa concretamente a los enumeradores como números enteros.
Algunos tipos de enumeradores pueden estar integrados en el lenguaje. El tipo booleano , por ejemplo, suele ser una enumeración predefinida de los valores False y True . También se puede definir un tipo de unidad que consta de un único valor para representar null . Muchos lenguajes permiten a los usuarios definir nuevos tipos enumerados.
Los valores y variables de un tipo enumerado generalmente se implementan con algún tipo entero como representación subyacente. Algunos lenguajes, especialmente los lenguajes de programación de sistemas , permiten al usuario especificar la combinación de bits que se utilizará para cada enumerador, lo que puede resultar útil para representar de manera eficiente conjuntos de enumeradores como cadenas de bits de longitud fija. En la teoría de tipos , los tipos enumerados suelen considerarse uniones etiquetadas de tipos de unidades . Dado que estos tipos tienen la forma , también pueden escribirse como números naturales.
Algunos de los primeros lenguajes de programación no tenían originalmente tipos enumerados. Si un programador quisiera que una variable, por ejemplo myColor , tuviera un valor rojo, la variable rojo sería declarada y se le asignaría algún valor arbitrario, generalmente una constante entera. La variable rojo luego se asignaría a myColor . Otras técnicas asignaban valores arbitrarios a cadenas que contenían los nombres de los enumeradores.
A veces se hacía referencia a estos valores arbitrarios como números mágicos, ya que a menudo no había ninguna explicación sobre cómo se obtuvieron los números o si sus valores reales eran significativos. Estos números mágicos podrían hacer que el código fuente sea más difícil de entender y mantener para otros.
Los tipos enumerados, por otro lado, hacen que el código sea más autodocumentado. Dependiendo del idioma, el compilador podría asignar automáticamente valores predeterminados a los enumeradores, ocultando así detalles innecesarios al programador. Es posible que estos valores ni siquiera sean visibles para el programador (ver información oculta ). Los tipos enumerados también pueden evitar que un programador escriba código ilógico, como realizar operaciones matemáticas con los valores de los enumeradores. Si se imprimiera el valor de una variable a la que se le asignó un enumerador, algunos lenguajes de programación también podrían imprimir el nombre del enumerador en lugar de su valor numérico subyacente. Una ventaja adicional es que los tipos enumerados pueden permitir a los compiladores imponer la corrección semántica. Por ejemplo: myColor = TRIANGLE
puede prohibirse, mientras que myColor = RED
se acepta, incluso si TRIANGLE y RED están representados internamente como 1 .
Conceptualmente, un tipo enumerado es similar a una lista de nominales (códigos numéricos), ya que a cada valor posible del tipo se le asigna un número natural distintivo. Un tipo enumerado dado es, por tanto, una implementación concreta de esta noción. Cuando el orden es significativo y/o se utiliza para comparación, entonces un tipo enumerado se convierte en un tipo ordinal .
Los lenguajes de programación tienden a tener sus propios estilos de programación y convenciones de nomenclatura , a menudo múltiples . La variable asignada a una enumeración suele ser un sustantivo en forma singular y con frecuencia sigue una convención PascalCase o mayúsculas , mientras que las minúsculas y otras se ven con menos frecuencia.
En Pascal , un tipo enumerado se puede declarar implícitamente enumerando los valores en una lista entre paréntesis:
var palo : ( tréboles , diamantes , corazones , espadas ) ;
La declaración a menudo aparecerá en una declaración de sinónimo de tipo, de modo que pueda usarse para múltiples variables:
tipo cardsuit = ( tréboles , diamantes , corazones , espadas ) ; tarjeta = palo de registro : traje de tarjeta ; valor : 1 .. 13 ; fin ; var mano : matriz [ 1 .. 13 ] de tarjeta ; triunfo : traje de cartas ;
El orden en el que se dan los valores de enumeración es importante. Un tipo enumerado es un tipo ordinal, y las pred
funciones succ
y darán el valor anterior o siguiente de la enumeración y ord
pueden convertir los valores de enumeración a su representación entera. Sin embargo, Standard Pascal no ofrece una conversión de tipos aritméticos a enumeraciones. Extended Pascal ofrece esta funcionalidad a través de una succ
función extendida. Algunos otros dialectos de Pascal lo permiten mediante tipos de letra. Algunos descendientes modernos de Pascal, como Modula-3 , proporcionan una sintaxis de conversión especial utilizando un método llamado VAL
; Modula-3 también trata BOOLEAN
y CHAR
como tipos y usos enumerados predefinidos especiales ORD
y VAL
para la decodificación y codificación ASCII estándar.
Los lenguajes de estilo Pascal también permiten utilizar la enumeración como índice de matriz:
var suitcount : matriz [ cardsuit ] de entero ;
En Ada , el uso de "=" fue reemplazado por "es", dejando la definición bastante similar:
el tipo Cardsuit es ( tréboles , diamantes , corazones , espadas );
Además de Pred
, y Succ
Ada también admite conversiones de cadenas simples mediante y .Val
Pos
Image
Value
Al igual que los lenguajes de estilo C, Ada permite especificar la representación interna de la enumeración:
para uso de Cardsuit ( tréboles => 1 , diamantes => 2 , corazones => 4 , espadas => 8 );
A diferencia de los lenguajes de estilo C, Ada también permite especificar el número de bits de la enumeración:
para el tamaño Cardsuit use 4 ; -- 4 bits
Además, se pueden usar enumeraciones como índices para matrices, como en Pascal, pero hay atributos definidos para las enumeraciones.
Barajado : matriz constante ( Cartas ) de Cartas : = ( Tréboles => Cartas ' Succ ( Tréboles ), - ver atributos de enumeraciones 'Primero, 'Último, 'Succ, 'Pred Diamantes => Corazones , --un valor explícito Corazones => Cardsuit ' Último , --primer valor de enumeración del tipo Cardsuit, por ejemplo, tréboles Picas => Cardsuit ' Primer --último valor de enumeración del tipo Cardsuit, por ejemplo, espadas );
Al igual que Modula-3, Ada trata Boolean
y Character
como tipos enumerados especiales predefinidos (en el paquete " Standard
"). A diferencia de Modula-3, también se pueden definir tipos de caracteres propios:
tipo Tarjetas es (' 7 ', ' 8 ', ' 9 ', ' J ', ' Q ', ' K ', ' A ');
El dialecto K&R original del lenguaje de programación C no tenía tipos enumerados. [1] En C, las enumeraciones se crean mediante definiciones explícitas (la enum
palabra clave por sí sola no provoca la asignación de almacenamiento) que utilizan la enum
palabra clave y recuerdan a las definiciones de estructura y unión :
enum cardsuit { Tréboles , Diamantes , Corazones , Espadas }; tarjeta de estructura { enumeración traje de tarjeta ; valor int corto ; } mano [ 13 ]; triunfo de la carta de enumeración ;
C expone la representación entera de los valores de enumeración directamente al programador. Los números enteros y los valores de enumeración se pueden mezclar libremente y se permiten todas las operaciones aritméticas con valores de enumeración. Incluso es posible que una variable de enumeración contenga un número entero que no represente ninguno de los valores de enumeración. De hecho, de acuerdo con la definición del lenguaje, el código anterior definirá Clubs
, Diamonds
, Hearts
y Spades
como constantes de tipo int
, a las que solo se convertirá (silenciosamente) enum cardsuit
si se almacenan en una variable de ese tipo.
C también permite al programador elegir explícitamente los valores de las constantes de enumeración, incluso sin tipo. Por ejemplo,
enum cardsuit { Tréboles = 1 , Diamantes = 2 , Corazones = 4 , Espadas = 8 };
podría usarse para definir un tipo que permita representar conjuntos matemáticos de trajes mediante enum cardsuit
operaciones lógicas bit a bit.
Desde C23 , el programador puede especificar el tipo subyacente de una enumeración: [2]
enum cardsuit : char { Tréboles = 1 , Diamantes = 2 , Corazones = 4 , Espadas = 8 };
Los tipos enumerados en el lenguaje de programación C# conservan la mayor parte de la semántica de "enteros pequeños" de las enumeraciones de C. Algunas operaciones aritméticas no están definidas para enumeraciones, pero un valor de enumeración se puede convertir explícitamente a un número entero y viceversa, y una variable de enumeración puede tener valores que no fueron declarados por la definición de enumeración. Por ejemplo, dado
enum Cardsuit { Tréboles , Diamantes , Espadas , Corazones }
las expresiones CardSuit.Diamonds + 1
y CardSuit.Hearts - CardSuit.Clubs
se permiten directamente (porque puede tener sentido recorrer la secuencia de valores o preguntar cuántos pasos hay entre dos valores), pero CardSuit.Hearts * CardSuit.Spades
se considera que tiene menos sentido y solo se permite si los valores se convierten primero a números enteros. .
C# también proporciona la característica similar a C de poder definir valores enteros específicos para enumeraciones. Al hacer esto, es posible realizar operaciones binarias en enumeraciones, tratando así los valores de enumeración como conjuntos de indicadores. Estos indicadores se pueden probar mediante operaciones binarias o con el método incorporado 'HasFlag' del tipo Enum.
La definición de enumeración define nombres para los valores enteros seleccionados y es azúcar sintáctica , ya que es posible asignar a una variable de enumeración otros valores enteros que no están dentro del alcance de la definición de enumeración. [3] [4] [5]
C++ tiene tipos de enumeración que se heredan directamente de C y funcionan en su mayoría de la misma manera, excepto que una enumeración es un tipo real en C++, lo que proporciona una verificación adicional en tiempo de compilación. Además (al igual que con las estructuras), la enum
palabra clave C++ se combina con typedef , de modo que en lugar de nombrar el tipo enum name
, simplemente nómbrelo name
. Esto se puede simular en C usando un typedef:typedef enum {Value1, Value2} name;
C++ 11 también proporciona un segundo tipo de enumeración, llamada enumeración de ámbito . Estos son de tipo seguro: los enumeradores no se convierten implícitamente a un tipo entero. Entre otras cosas, esto permite definir la transmisión de E/S para el tipo de enumeración. Otra característica de las enumeraciones con alcance es que los enumeradores no tienen fugas, por lo que su uso requiere anteponer el nombre de la enumeración (por ejemplo, Color::Red
para el primer enumerador en el ejemplo siguiente), a menos que se haya utilizado una using enum
declaración (introducida en C++20 ). para llevar a los enumeradores al alcance actual. Una enumeración con ámbito se especifica mediante la frase enum class
(o enum struct
). Por ejemplo:
clase de enumeración Color { Rojo , Verde , Azul };
El tipo subyacente de una enumeración es un tipo integral definido por la implementación que es lo suficientemente grande como para contener todos los valores enumerados; no tiene que ser el tipo más pequeño posible. El tipo subyacente se puede especificar directamente, lo que permite "declaraciones directas" de enumeraciones:
clase de enumeración Color : largo { rojo , verde , azul }; // debe ajustarse en tamaño y diseño de memoria al tipo de clase de enumeración 'larga' Formas : char ; // declaración directa. Si luego hay valores definidos que no caben en 'char' es un error.
Go usa la iota
palabra clave para crear constantes enumeradas. [6]
escriba ByteSize float64 const ( _ = iota // ignora el primer valor asignando un identificador en blanco KB ByteSize = 1 << ( 10 * iota ) MB GB )
Los tipos enumerados son una característica importante del lenguaje; pueden tener parámetros de tipo y ser recursivos. [7] Proporcionan soporte básico para tipos de datos algebraicos , permitiendo la inclusión de tipos de productos , de una manera similar a Haskell y ML . Una switch
expresión puede aplicar coincidencia de patrones a un valor de enumeración, lo que permite soluciones elegantes a problemas de programación complejos:
enumeración Color { rojo ; verde ; azul ; rgb ( r : Int , g : Int , b : Int ); } clase Colores { función estática toInt ( c : Color ): Int { return switch ( c ) { case red : 0xFF0000 ; caso verde : 0x00FF00 ; caso azul : 0x0000FF ; caso rgb ( r , g , b ): ( r << 16 ) | ( gramo << 8 ) | b ; } } función estática validCalls () { var redint = toInt ( Color . rojo ); var rgbint = toInt ( Color . rgb ( 100 , 100 , 100 )); } }
Ejemplos de tipos de enumeración paramétrica son los tipos de biblioteca estándar de Haxe Opción [8] y Cualquiera: [9]
enumeración Opción < T > { Algunos ( v : T ); Ninguno ; } enumeración Cualquiera < L , R > { Izquierda ( v : L ); Derecha ( v : R ); }
La versión J2SE 5.0 del lenguaje de programación Java agregó tipos enumerados cuya sintaxis de declaración es similar a la de C :
enum Cardsuit { CLUBES , DIAMANTES , ESPADAS , CORAZONES }; ... triunfo del traje de cartas ;
Sin embargo, el sistema de tipos de Java trata las enumeraciones como un tipo separado de los números enteros y no se permite la mezcla de valores de enumeración y enteros. De hecho, un tipo de enumeración en Java es en realidad una clase especial generada por el compilador en lugar de un tipo aritmético, y los valores de enumeración se comportan como instancias globales pregeneradas de esa clase. Los tipos de enumeración pueden tener métodos de instancia y un constructor (cuyos argumentos se pueden especificar por separado para cada valor de enumeración). Todos los tipos de enumeración extienden implícitamente la Enum
clase abstracta. No se puede crear una instancia de un tipo de enumeración directamente. [12]
Internamente, cada valor de enumeración contiene un número entero, correspondiente al orden en el que se declaran en el código fuente, comenzando desde 0. El programador no puede establecer un número entero personalizado para un valor de enumeración directamente, pero se pueden definir constructores sobrecargados que luego pueden asignar valores arbitrarios a miembros autodefinidos de la clase enum. La definición de captadores permite el acceso a esos miembros autodefinidos. El número entero interno se puede obtener a partir de un valor de enumeración usando el ordinal()
método, y la lista de valores de enumeración de un tipo de enumeración se puede obtener en orden usando el values()
método. En general, se desaconseja que los programadores conviertan enumeraciones en números enteros y viceversa. [13] Los tipos enumerados son Comparable
, utilizando el número entero interno; como resultado, se pueden clasificar.
La biblioteca estándar de Java proporciona clases de utilidad para usar con enumeraciones. La EnumSet
clase implementa una Set
serie de valores de enumeración; se implementa como una matriz de bits , lo que la hace muy compacta y tan eficiente como la manipulación explícita de bits, pero más segura. La EnumMap
clase implementa una Map
lista de valores de enumeración para objetar. Se implementa como una matriz, con el valor entero del valor de enumeración como índice.
Los lenguajes tipados dinámicamente en la tradición sintáctica de C (por ejemplo, Perl o JavaScript ) no proporcionan, en general, enumeraciones. Pero en la programación en Perl se puede obtener el mismo resultado con la lista abreviada de cadenas y hashes (posiblemente cortes ):
my @enum = qw(Tréboles Diamantes Corazones Espadas) ; mi ( %set1 , %set2 ); @set1 { @enum } = (); # todo borrado @set2 { @enum } = ( 1 ) x @enum ; # todo configurado en 1 $set1 { Tréboles } ... # false $set2 { Diamantes } ... # verdadero
Raku (anteriormente conocido como Perl 6) admite enumeraciones. Hay varias formas de declarar enumeraciones en Raku, y todas crean un mapa de fondo.
enum Gato <sphynx siamés de pelo corto de bengala otro> ; # Usando "palabras entre comillas"
enum Cat ( 'esfinge' , 'siamés' , 'bengala' , 'pelo corto' , 'otro' ); # Usando una lista
enumeración Gato ( sphynx => 0 , siamés => 1 , bengala => 2 , pelo corto => 3 , otro => 4 ); # Usando constructores de pares
enumerar Gato (: sphynx ( 0 ), : siamés ( 1 ), : bengala ( 2 ), pelo corto ( 3 ), : otro ( 4 )); # Otra forma de usar pares, también puedes usar `:0sphynx`
Las enumeraciones se agregaron en PHP versión 8.1.
enum CardSuit { caso Corazones ; caso Diamantes ; caso Clubes ; caso espadas ; }
Los enumeradores pueden estar respaldados por cadenas o valores enteros para facilitar la serialización:
enum CardSuit : cadena { case Corazones = 'H' ; caso Diamantes = 'D' ; caso Clubes = 'C' ; caso Picas = 'S' ; }
La interfaz de Enum expone un método que proporciona una colección de sus enumeradores y sus nombres. Las enumeraciones respaldadas por cadenas/números enteros también exponen el valor de respaldo y los métodos para (intentar) la deserialización. Los usuarios pueden agregar más métodos.
Aunque Rust usa la enum
palabra clave como C, la usa para describir uniones etiquetadas , cuyas enumeraciones pueden considerarse una forma degenerada. Por lo tanto, las enumeraciones de Rust son mucho más flexibles y pueden contener variantes de estructuras y tuplas.
enum Mensaje { Salir , Mover { x : i32 , y : i32 }, // estructura Escribir ( Cadena ), // tupla de un solo elemento ChangeColor ( i32 , i32 , i32 ), // tupla de tres elementos }
En C, las enumeraciones asignan nombres relacionados a un conjunto de valores enteros. En Swift , las enumeraciones son mucho más flexibles y no necesitan proporcionar un valor para cada caso de la enumeración. Si se proporciona un valor (denominado valor sin formato ) para cada caso de enumeración, el valor puede ser una cadena, un carácter o un valor de cualquier tipo entero o de punto flotante.
Alternativamente, los casos de enumeración pueden especificar valores asociados de cualquier tipo que se almacenarán junto con cada valor de caso diferente, de forma muy parecida a como lo hacen las uniones o variantes en otros idiomas. Se puede definir un conjunto común de casos relacionados como parte de una enumeración, cada uno de los cuales tiene un conjunto diferente de valores de tipos apropiados asociados.
En Swift, las enumeraciones son un tipo de primera clase. Adoptan muchas características que tradicionalmente solo admiten las clases, como propiedades calculadas para proporcionar información adicional sobre el valor actual de la enumeración y métodos de instancia para proporcionar funcionalidad relacionada con los valores que representa la enumeración. Las enumeraciones también pueden definir inicializadores para proporcionar un valor de caso inicial y pueden ampliarse para ampliar su funcionalidad más allá de su implementación original; y puede ajustarse a protocolos para proporcionar una funcionalidad estándar.
enum CardSuit { caso tréboles caso diamantes caso corazones caso espadas }
A diferencia de C y Objective-C , a los casos de enumeración Swift no se les asigna un valor entero predeterminado cuando se crean. En el ejemplo anterior de CardSuit, tréboles, diamantes, corazones y espadas no son implícitamente iguales a 0, 1, 2 y 3. En cambio, los diferentes casos de enumeración son valores completos por derecho propio, con un tipo de CardSuit definido explícitamente. .
Pueden aparecer varios casos en una sola línea, separados por comas:
enum CardSuit { caso tréboles , diamantes , corazones , espadas }
Cuando se trabaja con enumeraciones que almacenan valores sin procesar de cadenas o números enteros, no es necesario asignar explícitamente un valor sin procesar para cada caso porque Swift asignará los valores automáticamente.
Por ejemplo, cuando se utilizan números enteros para valores sin procesar, el valor implícito para cada caso es uno más que el caso anterior. Si el primer caso no tiene un valor establecido, su valor es 0. Para el ejemplo de CardSuit, los palos se pueden numerar comenzando desde 1 escribiendo:
enum CardSuit { caso tréboles = 1 , diamantes , corazones , espadas }
TypeScript agrega un tipo de datos 'enum' a JavaScript.
enum Cardsuit { Tréboles , Diamantes , Corazones , Picas }; var c : Cardsuit = Cardsuit . diamantes ;
De forma predeterminada, enumera los miembros numéricos que comienzan en 0; esto se puede anular estableciendo el valor del primero:
enum Cardsuit { Tréboles = 1 , Diamantes , Corazones , Picas }; var c : Cardsuit = Cardsuit . diamantes ;
Se pueden configurar todos los valores:
enum Cardsuit { Tréboles = 1 , Diamantes = 2 , Corazones = 4 , Espadas = 8 }; var c : Cardsuit = Cardsuit . diamantes ;
TypeScript admite asignar el valor numérico a su nombre. Por ejemplo, esto encuentra el nombre del valor 2:
enum Cardsuit { Tréboles = 1 , Diamantes , Corazones , Picas }; var nombre del traje : cadena = Traje de carta [ 2 ]; alerta ( nombre del traje );
Se agregó un módulo de enumeración a la biblioteca estándar de Python en la versión 3.4.
from enum import Enum class Tarjetas ( Enum ): CLUBES = 1 DIAMANTES = 2 CORAZONES = 3 ESPADAS = 4
También hay una API funcional para crear enumeraciones con índices generados automáticamente (comenzando con uno):
Cartas = Enum ( "Tarjetas" , "CLUBES DIAMANTES CORAZONES ESPADAS" )
Las enumeraciones de Python no imponen la corrección semántica (una comparación sin sentido con una enumeración incompatible siempre devuelve False en lugar de generar un TypeError ):
>>> Color = Enum ( "Color" , "ROJO VERDE AZUL" ) >>> Forma = Enum ( "Forma" , [ "CÍRCULO" , "TRIÁNGULO" , "CUADRADO" , "HEXÁGONO" ]) >>> def has_vertices ( forma ): ... devolver forma ! = Forma . CÍRCULO ... >>> has_vertices ( Color . VERDE ) Verdadero
Fortran sólo tiene tipos enumerados para la interoperabilidad con C; por lo tanto, la semántica es similar a C y, como en C, los valores de enumeración son solo números enteros y no se realiza ninguna verificación de tipo adicional. El ejemplo de C anterior se puede escribir en Fortran como
enumeración , enlazar ( C ) enumerador :: CLUBES = 1 , DIAMANTES = 2 , CORAZONES = 4 , ESPADAS = 8 end enum
A los tipos de datos enumerados en Visual Basic (hasta la versión 6) y VBA se les asigna automáticamente el Long
tipo de datos " " y también se convierten en un tipo de datos ellos mismos:
' Enum de base cero CardSuit Clubs Diamonds Hearts Spades End Enum Sub EnumExample () Traje oscuro Como traje CardSuit = Traje Diamonds MsgBox End Sub
Código de ejemplo en VB.NET
Enum CartaPalo Tréboles Diamantes Corazones Picas Fin Enum Sub EnumExample () Traje atenuado Como traje CardSuit = CardSuit . Cuadro de mensajes de diamantes . mostrar ( traje ) Fin Sub
Common Lisp utiliza el especificador de tipo de miembro, por ejemplo,
( deftype cardsuit () ' ( miembro del club diamante corazón espada ))
que establece que el objeto es del tipo palo si es #'eql
de trébol, diamante, corazón o espada. Sin embargo , el especificador de tipo de miembro no es válido como especialista de parámetros del Common Lisp Object System (CLOS). En su lugar, se puede usar (eql atom)
, que es el equivalente a (member atom)
(es decir, solo se puede especificar un miembro del conjunto con un especificador de tipo eql; sin embargo, se puede usar como especialista de parámetros CLOS). En otras palabras, para definir métodos. Para cubrir un tipo enumerado, se debe definir un método para cada elemento específico de ese tipo.
Además,
( deftype tipo -conjunto-de-elementos-finitos ( & elementos resto ) ` ( miembro , @ elementos ))
se puede utilizar para definir tipos enumerados arbitrarios en tiempo de ejecución. Por ejemplo
( pala de corazón de diamante de trébol tipo conjunto de elementos finitos )
se referiría a un tipo equivalente a la definición anterior de cardsuit, como por supuesto simplemente habría estado usando
( miembro del club diamante corazón espada )
pero puede resultar menos confuso con la función #'member
por razones estilísticas.
Dart admite la forma más básica de enumeraciones y tiene una sintaxis que es muy similar a la de otros lenguajes que admiten enumeraciones.
enumeración CardSuite { clubes , diamantes , Corazones , Espadas}vacío principal () { Tarjeta CardSuite = TarjetaSuite . clubes ; // Dart usa el operador "switch" para hacer coincidir el valor de una enumeración con la salida deseada. cambiar ( tarjeta ) { caso CardSuite . Clubes: { imprimir ( "Clubes" ); } romper ; caso CardSuite . Diamantes: { imprimir ( "Diamantes" ); } romper ; caso CardSuite . Corazones: { imprimir ( "Corazones" ); } romper ; caso CardSuite . Espadas: { imprimir ( "picas" ); } romper ; por defecto : { imprimir ( "Desconocido" ); } romper ; }}
Tenga en cuenta que el operador de conmutación no garantiza la integridad de los casos. Esto significa que si omite un caso, el compilador no generará un error.
En los lenguajes de programación funcionales del linaje ML (por ejemplo, Standard ML (SML), OCaml y Haskell ), se puede utilizar un tipo de datos algebraico con solo constructores nulos para implementar un tipo enumerado. Por ejemplo (en la sintaxis de firmas SML):
tipo de datos cardsuit = Tréboles | Diamantes | Corazones | Carta tipo espadas = { palo : palo de cartas ; valor : int } val mano : lista de cartas val triunfo : palo de cartas
En estos lenguajes, la representación de entero pequeño está completamente oculta para el programador, si es que la implementación emplea dicha representación. Sin embargo, Haskell tiene la Enum
clase de tipo que un tipo puede derivar o implementar para obtener una asignación entre el tipo y Int
.
Algunas bases de datos admiten tipos enumerados directamente. MySQL proporciona un tipo enumerado ENUM
con valores permitidos especificados como cadenas cuando se crea una tabla. Los valores se almacenan como índices numéricos con la cadena vacía almacenada como 0, el primer valor de cadena almacenado como 1, el segundo valor de cadena almacenado como 2, etc. Los valores se pueden almacenar y recuperar como índices numéricos o valores de cadena. [14]
Ejemplo:
CREAR TABLA camisetas ( nombre VARCHAR ( 40 ), talla ENUM ( 'x-pequeña' , 'pequeña' , 'mediana' , 'grande' , 'x-grande' ) );
El esquema XML admite tipos enumerados a través de la faceta de enumeración utilizada para restringir los tipos de datos más primitivos, como las cadenas.
<xs:element name= "cardsuit" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:enumeration value = "Tréboles" /> <xs:enumeration value= "Diamantes" /> < xs: valor de enumeración= "Corazones" /> <xs: valor de enumeración= "picas" /> </xs:restricción> </xs:simpleType> </xs:element>
En Java, los tipos enumerados son una clase completa, lo que significa que son seguros para tipos y se pueden ampliar agregando métodos, campos o incluso implementando interfaces. Mientras que en C#, un tipo enumerado es simplemente azúcar sintáctico alrededor de un tipo integral (normalmente un int), lo que significa que no se pueden extender y no son seguros para tipos.
{{cite web}}
: Mantenimiento CS1: bot: estado de la URL original desconocido ( enlace )Enumeración sind the 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 other Programmiersprachen wie C/C++ y C# kann man ihnen per Gleichheitszeichen keine ganzen Zahlen zuordnen.
{{cite web}}
: Mantenimiento CS1: varios nombres: lista de autores ( enlace )URL alternativa Archivado el 27 de mayo de 2013 en Wayback Machine.// Una enumeración mal diseñada no hace esto... Obviamente (como con todo lo demás), podemos hacer un mal uso de este trozo de azúcar y terminar con un sistema que sufre de hiperglucemia. … Dado que el tipo subyacente de nuestra enumeración es un int (también puede usar otros tipos integrales), puede generar algunos problemas interesantes al usar una enumeración como indicadores de bits a través de operadores bit a bit.
{{cite web}}
: Mantenimiento CS1: bot: estado de la URL original desconocido ( enlace )