Jer*_*unh 3 types exception ada
我知道在从基类型赋值给受约束的子类型时,如果我不确保该值在赋值之前在范围内,那么我在运行时会遇到Range_Check异常的风险.
但是在进行比较时这也是正确的吗?我认为,由于用户想要的唯一知识是布尔结果,因此不需要隐式转换为基本类型或范围检查.
请注意:我正在寻找引用Ada95 LRM的答案.
declare
type Day_Type is (SUN, MON, TUE, WED, THU, FRI, SAT);
subtype Workday_Type is MON .. FRI;
Payday : constant Workday_Type := FRI;
...
function Is_Payday (Day : Day_Type)
return Boolean is
begin
return (Day = Payday);
end Is_Payday;
begin
-- Will this raise a RANGE_CHECK error in Is_Payday()?
if Is_Payday(Day => SAT) then
...
elsif Is_Payday(Day => FRI) then
...
end if;
end;
Run Code Online (Sandbox Code Playgroud)
我还没有找到完整的答案.但我确实找到了几个有趣的数据.
离散类型的操作/第3.5.5章第12节它说:
3.2类型和子类型 - 本章仅讨论如何定义类型和子类型.
3.5.5离散类型的操作 - 本章中有一个有趣的注释,但我不确定本章或其他任何内容是否相关.
(31)对于离散类型的子类型,属性Val传递的结果可能不属于子类型; 类似地,属性Pos的实际参数不必属于子类型.这些属性满足以下关系(在没有例外的情况下):
Run Code Online (Sandbox Code Playgroud)S'Val(S'Pos(X)) = X S'Pos(S'Val(N)) = N
4.5.1逻辑运算符和短路控制表单 - 这里没有关于类型与子类型的信息.
(20)除了显式的type_conversions之外,类型转换是在构造的预期类型和实际类型不同的情况下隐式执行的,如类型解析规则所允许的那样(见8.6).例如,整数文字的类型为universal_integer,并在分配给某个特定整数类型的目标时进行隐式转换.类似地,当相应的形式参数是类范围类型时,隐式转换特定标记类型的实际参数.
即使预期和实际类型相同,也会执行隐式子类型转换以调整操作数的数组边界(如果有)以匹配所需的目标子类型,或者如果(可能已调整的)值不满足,则引发Constraint_Error目标子类型的约束.
这似乎表明隐式类型转换将始终执行到子类型(我很难阅读该语言).但我没有看到任何声明在所需的子类型和基类型之间进行比较的地方.
我也对声明感到困惑:
执行隐式子类型转换以调整操作数的数组边界(如果有)以匹配所需的目标子类型
Ada95理由 - 第一部分概述 - 这太高了.这里没什么好帮的.
Ada95基本原理 - 第二部分 - 3.1类型,类,对象和视图 - 此部分有很多关于类型的深刻信息,但仍然与比较类型和子类型无关
我可能在搜索中错过了答案.但我正在寻找这种或那种方式的明确证据.
很抱歉长时间阅读.
您可能会发现Annotated ARM版本(AARM95 3.2)很有用(请注意,您的参考资料是未维护的AdaHome网站;更喜欢http://www.adaic.org).
子类型具有类型和可能的约束:
type T is ...;
subtype S1 is T; -- effectively a renaming of T
subtype S2 is T range ...; -- (added) constraints
Run Code Online (Sandbox Code Playgroud)
并且子类型的操作是其类型的操作,这就是为什么你可以在Day = Payday
没有转换的情况下编写比较.我们知道a Workday_Type
是a Day_Type
,所以我们可以直接进行比较.
确实Workday_Type (Day) = Payday
存在CE的风险,但是您或编译器不需要这样做.