Ada 编程/类型/枚举
枚举类型定义为可能的取值的列表
typePrimary_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 的字符串可以是任何大小写。
字面量是可以重载的,也就是说你可以用相同的字面量拥有另一个类型。
typeTraffic_Lightis(Red, Yellow, Green);
在使用字面量的上下文中,重载解析通常会解析出哪个 Red 是指的。 只有当存在无法解析的重载冲突时,才能使用特殊语法来限定哪个 Red 是指的
Primary_Color'(Red)
与许多其他声明性项目一样,枚举字面量可以被重命名。 事实上,这样的字面量实际上是一个函数,因此它必须被重命名为函数
functionRedreturnP.Primary_ColorrenamesP.Red;
在此,Primary_Color 被假定在包 P 中定义,该包在重命名声明的位置可见。 重命名使 Red 直接可见,无需使用 use 子句。
请注意,作为函数的重新声明不会影响字面量的静态性。
Ada 中非常独特的是将字符字面量用作枚举字面量
typeABCis('A', 'B', 'C');
这个字面量 'A' 与预定义类型 Character(或 Wide_Character)的字面量 'A' 完全没有共同之处。
每个至少有一个字符字面量的类型都是字符类型。 对于每种字符类型,字符串字面量和连接运算符 "&" 也隐式定义。
typeMy_Characteris(No_Character, 'a', Literal, 'z');typeMy_Stringisarray(Positiverange<>)ofMy_Character; S: My_String := "aa" & Literal & "za" & 'z'; T: My_String := ('a', 'a', Literal, 'z', 'a', 'z');
在此示例中,S 和 T 的值相同。
Ada 的 Character 类型就是这样定义的。 参见Ada 编程/库/Standard.
布尔值也定义为枚举类型
typeBooleanis(False, True);
此声明中隐含着特殊语义,即此类型的对象和表达式可以用作条件。 请注意,字面量 False 和 True 不是 Ada 关键字。
因此,仅仅声明一个具有这些字面量的类型,然后希望此类型的对象可以用作这样,是不够的
typeMy_Booleanis(False, True); Condition: My_Boolean;ifConditionthen-- wrong, won't compile
如果需要自己的布尔值(可能具有特殊的尺寸要求),则需要从预定义的布尔值派生
typeMy_BooleanisnewBoolean; Condition: My_Boolean;ifConditionthen-- OK
您可以使用范围为枚举类型创建子类型
subtypeCapital_LetterisCharacterrange'A' .. 'Z';
typeDay_Of_Weekis(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);subtypeWorking_DayisDay_Of_WeekrangeMonday .. Friday;
枚举类型是标量子类型,因此类型属性如First和Succ将允许遍历值的子序列。
caseDay_Of_Week'FirstiswhenSunday => ISO (False);whenDay_Of_Week'Succ (Sunday) => ISO (True);whenTuesday .. Saturday =>raiseProgram_Error;endcase;
循环将自动遍历子类型范围内的值。 过滤工作日以仅包含偶数位置的工作日
forDayinWorking_DayloopifDay_Of_Week'Pos (Day)mod2 = 0thenWork_In_Backyard;endif;endloop;
枚举类型可用作数组索引子类型,从而产生表格功能
typeOfficer_IDisrange0 .. 50;typeScheduleisarray(Working_Day)ofOfficer_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
