Programación en Ada/Tipos/Enumeraciones
Un tipo enumeración es una lista definida de los posibles valores que puede adoptar un objeto de ese tipo. La declaración:
type
Color_Primariois
(Rojo, Verde, Azul);
establece que a un objeto del tipo Color_Primario se le puede asignar cualquiera de los tres valores indicados, y ningún otro valor. Como los tipos numéricos, donde por ejemplo 1 es un literal entero, Rojo, Verde y Azul son los llamados literales del tipo.
Las enumeraciones son uno de los tipos discretos, los otros son los tipos enteros.
Operadores y atributos predefinidos
editarAparte del operador de igualdad ("="), los tipos enumeración tienen predefinidos todos los operadores de orden: "<", "<=", "=", "/=", ">=", ">"; donde la relación de orden viene dada implicitamente por la secuencia de los literales: cada literal tiene una posición, empezando por 0 para el primero, que se incrementa en uno para cada sucesor. Esta posición se puede obtener mediante el atributo 'Pos; el inverso es 'Val, que devuelve el valor correspondiente a una posición. En nuestro ejemplo:
Color_Primario'Pos (Rojo) = 0 Color_Primario'Val (0) = Rojo
Los literales pueden sobrecargarse, es decir, puede haber otro tipo con los mismos literales.
type
Luz_de_Tráficois
(Rojo, Ambar, Verde);
Normalmente se puede determinar por el contexto a qué tipo pertenece el literal Rojo. Cuando es imposible, el programador ha de usar una expresión de desambiguación: Tipo'(Valor).
Literales carácter
editarUna característica bastante única de Ada es la posibilidad de usar literales caracter como literales de una enumeración.
type
ABCis
('A', 'B', 'C');
El literal 'A' no tiene mucho que ver con el literal 'A' del tipo predefinido Character (o Wide_Character).
Todo tipo que tiene al menos un literal carácter es un tipo carácter. Para todo tipo carácter, existen literales de cadena y el operador de concatenación predefinido "&".
type
Mi_Caracteris
(No_Caracter, 'a', Literal, 'z');type
Mi_Stringis
array
(Positiverange
<>)of
Mi_Caracter; S: Mi_String :="aa"
& Literal &"za"
& 'z'; T: Mi_String := ('a', 'a', Literal, 'z', 'a', 'z');
En este ejemplo, S y T contienen el mismo valor.
El tipo predefinido Character se define de este modo en el paquete Standard.
Tipo boolean
editarEl tipo predefinido boolean es una enumeración definida en el paquete Standard de este modo:
type
Booleanis
(False, True);
Por esta razón el tipo boolean tiene todos los atributos definidos para cualquier otra enumeración.
Subtipos de enumeración
editarSe puede usar un rango para definir un subtipo sobre una enumeración:
subtype
Letra_Mayúsculais
Characterrange
'A' .. 'Z';subtype
Color_Fríois
Color_Primariorange
Verde .. Azul;