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
[editar]Aparte 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
[editar]Una 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
[editar]El 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
[editar]Se 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;