跳转到内容

Ada 编程/类型/枚举

来自维基教科书,开放的书籍,为了一个开放的世界

Ada. Time-tested, safe and secure.
Ada。经久耐用,安全可靠。

枚举类型定义为可能的取值的列表

 type Primary_Color is (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_Light is (Red, Yellow, Green);

在使用字面量的上下文中,重载解析通常会解析出哪个 Red 是指的。 只有当存在无法解析的重载冲突时,才能使用特殊语法来限定哪个 Red 是指的

Primary_Color'(Red)

与许多其他声明性项目一样,枚举字面量可以被重命名。 事实上,这样的字面量实际上是一个函数,因此它必须被重命名为函数

function Red return P.Primary_Color renames P.Red;

在此,Primary_Color 被假定在包 P 中定义,该包在重命名声明的位置可见。 重命名使 Red 直接可见,无需使用 use 子句。

请注意,作为函数的重新声明不会影响字面量的静态性。

字符作为枚举字面量

[编辑 | 编辑源代码]

Ada 中非常独特的是将字符字面量用作枚举字面量

 type ABC is ('A', 'B', 'C');

这个字面量 'A' 与预定义类型 Character(或 Wide_Character)的字面量 'A' 完全没有共同之处。

每个至少有一个字符字面量的类型都是字符类型。 对于每种字符类型,字符串字面量和连接运算符 "&" 也隐式定义。

type My_Character is (No_Character, 'a', Literal, 'z');
type My_String is array (Positive range <>) 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 Boolean is (False, True);

此声明中隐含着特殊语义,即此类型的对象和表达式可以用作条件。 请注意,字面量 False 和 True 不是 Ada 关键字。

因此,仅仅声明一个具有这些字面量的类型,然后希望此类型的对象可以用作这样,是不够的

 type My_Boolean is (False, True);
 Condition: My_Boolean;

 if Condition then -- wrong, won't compile

如果需要自己的布尔值(可能具有特殊的尺寸要求),则需要从预定义的布尔值派生

 type My_Boolean is new Boolean;
 Condition: My_Boolean;

 if Condition then -- OK

枚举子类型

[编辑 | 编辑源代码]

您可以使用范围为枚举类型创建子类型

 subtype Capital_Letter is Character range 'A' .. 'Z';
 type Day_Of_Week is (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
 
 subtype Working_Day is Day_Of_Week range Monday .. Friday;

使用枚举

[编辑 | 编辑源代码]

枚举类型是标量子类型,因此类型属性如FirstSucc将允许遍历值的子序列。

     case Day_Of_Week'First is
        when Sunday =>
           ISO (False);
        when Day_Of_Week'Succ (Sunday) =>
           ISO (True);
        when Tuesday .. Saturday =>
           raise Program_Error;
     end case;

循环将自动遍历子类型范围内的值。 过滤工作日以仅包含偶数位置的工作日

     for Day in Working_Day loop
        if Day_Of_Week'Pos (Day) mod 2 = 0 then
           Work_In_Backyard;
        end if;
     end loop;

枚举类型可用作数组索引子类型,从而产生表格功能

  type Officer_ID is range 0 .. 50;
  type Schedule is array (Working_Day) of Officer_ID;

维基教科书

[编辑 | 编辑源代码]

Ada 参考手册

[编辑 | 编辑源代码]
华夏公益教科书