在这个问题中,我问如何定义一个范围的无限上限(事实证明答案是相当明显的,但不是对Ada的新人).在答案中,建议为此创建一个特定子类型.
问题中提到的类型的特定子类型如下所示:
Type Speed is Float range 0 .. Float'Last
Run Code Online (Sandbox Code Playgroud)
另外,我注意到这个Ada项目中的很大一部分代码都有特定的类型 - 比如Feet_Float等等Meters_Float.为什么这是首选的做法,而不是只float在类/包中的基本成员变量上放置范围约束?
Ada不喜欢亚型 - Ada程序员这样做.
新的类型和子类型(它们是不同的,都有它们的用途)有助于在如此少的成本或时间损失下捕获如此多的错误,这是一个谜,为什么好的类型系统到目前为止已经过时了.
例如,要认识到任何数组的索引都属于一个子类型(可能是匿名的,但是可以访问myArray'range,for i in myArray'range loop ... end loop;或者subtype myIndextype is myArray'range; theIndex : myIndextype;你会看到每个缓冲区溢出漏洞 - 或者攻击 - 只是一个类型错误 - 或者可能是,在阿达.
当你通过编译器得到一个错误时,第一次你的可执行文件以一个Exception : Constraint_Error怪异的指针接近错误而崩溃时,你将开始了解范围约束类型的值.
为了扩展这一点,我将提到更多的问答.
首先请注意,您可能正在使用的编译器Gnat可能不是严格遵守Ada,除非您在命令行(或项目文件)中添加了几个可选标志,如第一个示例中所述.最近的版本默认启用了其中一些版本.
这是一个被声明,使用和走出可见范围的子类型的例子(在一个declare块中,子类型的范围在运行时是未知的.与许多动态类型语言不同,这既快又安全,因为相关存储如果您对实现细节感兴趣,通常会在堆栈中.
这是一个极端的例子,不仅声明子类型,而且告诉编译器如何将它们打包到存储器中.嵌入式编程中常见的,无论是空间紧张(我在具有1kbyte内存的处理器中都有完整的数字手表!)或者用于访问硬件寄存器中的特定位.(请注意,如果更新为使用Ada-2012,此示例将更清晰aspects.)
此问答简要介绍了来自Java的新类型和子类型之间的区别.(我有点失望的是,Java专家在关闭之前没有回答任何问题,描述了他们如何处理相同的问题)
声明特定类型有以下好处:
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |