Ada 编程/类型/枚举
枚举类型定义为可能的取值的列表
type
Primary_Coloris
(Red, Green, Blue);
就像数值类型一样,例如 1 是一个整数字面量,Red、Green 和 Blue 被称为此类型的字面量。 此类型没有其他可分配的值。
除了相等性 ("=") 之外,枚举类型上唯一的运算符是排序运算符: "<"、"<="、"="、"/="、">="、">",其中排序关系由字面量的顺序隐式给出:每个字面量都有一个位置,从第一个开始为 0,每个后续字面量递增 1。此位置可以通过 'Pos 属性 查询;逆运算为 'Val,它返回相应的字面量。在我们的示例中
Primary_Color'Pos (Red) = 0 Primary_Color'Val (0) = Red
还有两个重要的属性:'Image 和 'Value(不要将 'Val 与 'Value 混淆)。'Image 返回值的字符串表示形式(大写字母),'Value 是反向操作
Primary_Color'Image ( Red ) = "RED" Primary_Color'Value ("Red") = Red
这些属性对于简单的IO 很重要(在 Ada.Text_IO 中有更复杂的 IO 功能,用于枚举类型)。请注意,由于 Ada 不区分大小写,因此传递给 'Value 的字符串可以是任何大小写。
字面量是可以重载的,也就是说你可以用相同的字面量拥有另一个类型。
type
Traffic_Lightis
(Red, Yellow, Green);
在使用字面量的上下文中,重载解析通常会解析出哪个 Red 是指的。 只有当存在无法解析的重载冲突时,才能使用特殊语法来限定哪个 Red 是指的
Primary_Color'(Red)
与许多其他声明性项目一样,枚举字面量可以被重命名。 事实上,这样的字面量实际上是一个函数,因此它必须被重命名为函数
function
Redreturn
P.Primary_Colorrenames
P.Red;
在此,Primary_Color 被假定在包 P 中定义,该包在重命名声明的位置可见。 重命名使 Red 直接可见,无需使用 use 子句。
请注意,作为函数的重新声明不会影响字面量的静态性。
Ada 中非常独特的是将字符字面量用作枚举字面量
type
ABCis
('A', 'B', 'C');
这个字面量 'A' 与预定义类型 Character(或 Wide_Character)的字面量 'A' 完全没有共同之处。
每个至少有一个字符字面量的类型都是字符类型。 对于每种字符类型,字符串字面量和连接运算符 "&" 也隐式定义。
type
My_Characteris
(No_Character, 'a', Literal, 'z');type
My_Stringis
array
(Positiverange
<>)of
My_Character; S: My_String := "aa" & Literal & "za" & 'z'; T: My_String := ('a', 'a', Literal, 'z', 'a', 'z');
在此示例中,S 和 T 的值相同。
Ada 的 Character 类型就是这样定义的。 参见Ada 编程/库/Standard.
布尔值也定义为枚举类型
type
Booleanis
(False, True);
此声明中隐含着特殊语义,即此类型的对象和表达式可以用作条件。 请注意,字面量 False 和 True 不是 Ada 关键字。
因此,仅仅声明一个具有这些字面量的类型,然后希望此类型的对象可以用作这样,是不够的
type
My_Booleanis
(False, True); Condition: My_Boolean;if
Conditionthen
-- wrong, won't compile
如果需要自己的布尔值(可能具有特殊的尺寸要求),则需要从预定义的布尔值派生
type
My_Booleanis
new
Boolean; Condition: My_Boolean;if
Conditionthen
-- OK
您可以使用范围
为枚举类型创建子类型
subtype
Capital_Letteris
Characterrange
'A' .. 'Z';
type
Day_Of_Weekis
(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);subtype
Working_Dayis
Day_Of_Weekrange
Monday .. Friday;
枚举类型是标量子类型,因此类型属性如First和Succ将允许遍历值的子序列。
case
Day_Of_Week'Firstis
when
Sunday => ISO (False);when
Day_Of_Week'Succ (Sunday) => ISO (True);when
Tuesday .. Saturday =>raise
Program_Error;end
case
;
循环将自动遍历子类型范围内的值。 过滤工作日以仅包含偶数位置的工作日
for
Dayin
Working_Dayloop
if
Day_Of_Week'Pos (Day)mod
2 = 0then
Work_In_Backyard;end
if
;end
loop
;
枚举类型可用作数组索引子类型,从而产生表格功能
type
Officer_IDis
range
0 .. 50;type
Scheduleis
array
(Working_Day)of
Officer_ID;
- Ada 编程
- Ada 编程/类型
- Ada 编程/库/Standard
- Ada_Programming/属性/'First
- Ada_Programming/属性/'Last
- Ada_Programming/属性/'Pred
- Ada_Programming/属性/'Succ
- Ada_Programming/属性/'Img
- Ada_Programming/属性/'Image
- Ada_Programming/属性/'Value
- Ada_Programming/属性/'Pos
- Ada_Programming/属性/'Val
- Ada_Programming/属性/'Enum_Rep
- Ada_Programming/属性/'Enum_Val