Ada 变体记录:多次使用组件
我创建了以下示例代码:Ada 变体记录:多次使用组件,ada,Ada,我创建了以下示例代码: type Category is (A, B, C); type My_Record (The_Category : Category) is record case The_Category is when A => A : Natural; when B => B : Integer; when C => A : Natu
type Category is (A, B, C);
type My_Record (The_Category : Category) is record
case The_Category is
when A =>
A : Natural;
when B =>
B : Integer;
when C =>
A : Natural;
B : Integer;
end case;
end record;
代码在Ada中显然无效,因为我遇到两个编译器错误:“A/B”与第行的声明冲突…
为什么Ada中不支持这种变体记录的定义?我认为这可能有用。有没有其他方法可以对这种数据结构建模?不支持这种方法,因为它可能会使读者(或开发人员)感到困惑 不同分支中的字段在逻辑上是不同的字段,因此使用相同的名称会造成混淆 (这是我的解释。如果有官方的解释,你可以在 我练习你这样做:
类型类别为(A、B、C);
类型数据(类别:类别)为记录
个案类别为
当A=>
标识符_1:自然的;
当B=>
标识符_2:整数;
当C=>
标识符_3:天然;
标识符_4:整数;
终例;
结束记录;
你必须想出一些实际的、合理的名字,因为我不知道你想解决哪个问题。我最近遇到了这个问题。这是艾达背着你的案子。Adaic(Pythonic equivalent?)方法类似于:
type Category is (A, B, C);
type A_Data is
record
A : Natural;
end record;
type B_Data is
record
B : Integer;
end record;
type C_Data is
record
A : Natural;
B : Integer;
end record;
type My_Record (The_Category : Category) is record
case The_Category is
when A =>
A : A_Data;
when B =>
B : B_Data;
when C =>
C : C_Data;
end case;
end record;
虽然冗长,但这提供了关于您有权访问的内容的强类型。用法几乎相同,主要区别是在C类中,事物看起来是一致的:
case My_Object.The_Category is
when A =>
Use_Integer (My_Object.A.A);
when B =>
Use_Natural (My_Object.B.B);
when C =>
Use_Integer (My_Object.C.A);
Use_Natural (My_Object.C.B);
end case;
很多人需要一些时间来习惯Ada的冗长,但随着时间的推移,你会爱上它。这个更大的接口编译成几乎相同的代码,并且更易于扩展(如果A类项目现在也需要浮点值呢?与其更改所有A类项目,不如更改A_数据类型)。听起来很难在内存中有效地映射这样的结构,因为B的地址会根据鉴别值而改变。在我的上一个项目中,这种类型将通过在字段前面加上判别值来建模。并且没有什么可以阻止第二个
a
是不同的类型!(例如,Long\u Float
)。我在AdaIC没有看到带注释的RM。然而,这是有道理的。不幸的是,对于这个提问者来说,这只是陈述了一个事实:“类型的值集……是不相交子集的并集,对应于两个可能的变体”。谢谢。对我已经在答案的正文中对AARM的基本原理进行了更正。请特别注意这个问题的第二个答案:Ada与Java非常相似,它通过从不做假设来优化编译时错误检测。