完全作为Ada型系统学习练习,我试图制作3种类型(或者更确切地说,类型和2种子类型):
Month_Type
,所有月份的枚举Short_Month_Type
,Month_Type
子类型只有30天的月份February_Month_Type
,一个只有二月的子类型似乎子类型必须使用range
机制,对吗? (还有其他类型的子类型吗?)为了让它与连续范围一起工作,我必须按以下顺序放置Month_Type
枚举:
type Month_Type is (February, April, June, September, November, January, March, May, July, August, October, December);
显然这不是几个月的自然顺序,我可以看到人/我试图做Month_Type'First
或者期望得到1月的事情。
所以,这个愚蠢的例子中有两个一般性问题:
谢谢!
答案 0 :(得分:5)
不,enumeration subtype仅在此上下文中承认range_constraint,但您可以使用Sets创建任意数量的Ada.Containers.Ordered_Sets
。有here和here示例。
答案 1 :(得分:5)
您可以创建一个对象,它只指定枚举中的某些值。我们通常称之为“集合”。
许多语言都设置为基本类型(以及数组和记录)。当然有些人没有。阿达有点中间。它不会 offical 具有名为“set”或类型的类型,但boolean
的数组上的boolean operations are defined to work like bitwise logical operations。如果你打包数组,你几乎可以得到其他语言的“set”类型给你的东西。所以 Ada确实支持集,它们只是被称为“布尔数组”。
type Month_Set is array (Month) of Boolean;
Short_Month : constant Month_Set :=
(September => true, April => true, June => true, November => true,
February => true, others => false);
Y_Month : constant Month_Set :=
(January => true, February => true, May => True, July => true,
others => false);
-- Inclusion
if (Short_Month(X)) then ...
-- Intersection (Short_Y will include only February)
Short_Y := Short_Month and Month_Ending_in_Y;
-- Union (Short_Y will include All Short_Months and all Y_Months
Short_Y := Short_Month or Month_Ending_in_Y;
-- Negation (Short_Y will include all Short_Months not ending in Y
Shorty_Y := Short_Month and not Month_Ending_in_Y;
答案 2 :(得分:2)
Trashgod回答了第一个问题。 要回答第二个问题,请将类型本身设为私有。
答案 3 :(得分:2)
您可以使用subtype predicates。在你的情况下:
subtype Short_Month_Type is Month_type with
Static_Predicate => Short_Month_Type in April | June | September | November