我创建了以下示例代码:
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" conflicts with declaration at line ...
为什么Ada不支持这种变体记录的定义?我认为它可能有用。是否有其他方法来模拟这种数据结构?
答案 0 :(得分:1)
不支持它,因为它可能会使读者(或开发者)感到困惑。
不同分支中的字段在逻辑上是不同的字段,因此使用相同的名称会令人困惑。
(这是我的解释。如果有正式的,你可以在Ada 83 Rationale找到它。)
我练习你做这样的事情:
type Categories is (A, B, C);
type Data (Category : Categories) is record
case Category is
when A =>
Identifier_1 : Natural;
when B =>
Identifier_2 : Integer;
when C =>
Identifier_3 : Natural;
Identifier_4 : Integer;
end case;
end record;
你必须自己提出一些实际的,明智的命名,因为我不知道你正试图解决哪个问题。
答案 1 :(得分:1)
我最近遇到了这个问题。这是Ada背后的情况。 Adaic(Pythonic等价?)的方式类似于:
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;
很多人花时间习惯阿达的冗长,但随着时间的推移你会学会喜欢它。这个更大的接口编译成几乎完全相同的代码,并且对可扩展性更加开放(如果类别A项目现在也需要浮点数而不是更改所有A类别项目,只需更改A_Data类型)。