Types Ada中子类型的非连续范围?
作为一个Ada类型的系统学习练习,我尝试制作3种类型(或者更确切地说,一种类型和2种亚类型):Types Ada中子类型的非连续范围?,types,visibility,ada,Types,Visibility,Ada,作为一个Ada类型的系统学习练习,我尝试制作3种类型(或者更确切地说,一种类型和2种亚类型): 月份\u类型,所有月份的枚举 Short\u Month\u Type,一种仅包含30天月份的Month\u Type子类型 二月\月份\类型,一个仅包含二月的子类型 似乎子类型必须使用范围机制,对吗?(还有其他类型的子类型吗?)为了让它在连续范围内工作,我必须按以下顺序放置我的Month\u Type枚举: type Month_Type is (February, April, June
,所有月份的枚举月份\u类型
,一种仅包含30天月份的Short\u Month\u Type
子类型Month\u Type
,一个仅包含二月的子类型二月\月份\类型
范围
机制,对吗?(还有其他类型的子类型吗?)为了让它在连续范围内工作,我必须按以下顺序放置我的Month\u Type
枚举:
type Month_Type is (February, April, June, September, November, January, March, May, July, August, October, December);
很明显,这不是自然的月份顺序,我可以看到人们/我试图先做Month\u Type's
或者一些期待一月到来的事情
因此,这个愚蠢的例子中有两个一般性问题:
谢谢 不,在这种情况下,an只允许a,但您可以创建任意数量的使用。这里有一些例子和例子。垃圾上帝回答了第一个问题。 要回答第二个问题,请将类型本身设置为私有。您可以设置一个只指定枚举中某些值的对象。我们通常称之为“集合” 许多语言都将集合作为基本类型(以及数组和记录)。当然有些人不会。艾达有点像中间人。它没有正式命名为“set”或任何类型,而是在
布尔值的数组上。如果你打包了这个数组,你会得到其他语言的“set”类型给你的东西。因此,Ada确实支持集合,它们被称为“布尔数组”
你可以用。就你而言:
subtype Short_Month_Type is Month_Type with
Static_Predicate => Short_Month_Type in April | June | September | November
这是可行的,但除了在复杂的情况下,它是不必要的。所以,这就是我用其他语言处理问题的方式。我感兴趣的是能够使用类型系统本身来指定短月份或奇数之类的东西。但是谢谢你让我知道这个功能并不总是可行的!是的,通过这种方式,可以在应用程序中公开尽可能多或尽可能少的抽象数据类型?我想如果我想让他们能够在2月左右发布,我就必须提供公开的“每月制作”功能,但不允许他们先做“每月制作”?是的;将实现隐藏在抽象数据类型中的另一个优点是,您可以根据需要对其进行更改,而客户机对此并不了解。例如,正如T.E.D.所建议的那样,Java在内部使用压缩布尔数组来提高效率。+1是一个很好的选择;这是一个很好的答案,关于Ada我还不知道。正如我在另一篇评论中解释的那样,我对类型系统本身能够从Y月识别出一个短的月很感兴趣,希望是在编译时。但显然,并不是所有人想要的都是可能的:)再次感谢。提及ADA2012中添加了子类型谓词可能会很有用,因此在最初的问题提出时(几个月前)还不可用
subtype Short_Month_Type is Month_Type with
Static_Predicate => Short_Month_Type in April | June | September | November