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
