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非常相似,它通过从不做假设来优化编译时错误检测。