为什么单元素记录聚合需要命名关联?

时间:2014-11-16 09:48:12

标签: record ada

当聚合只包含一个元素时,如下所示,位置表示法会导致编译错误,我们只能使用命名表示法。为什么呢?

type singleton is record
   v : integer;
end record;

v1 : singleton := (0);

导致编译器消息

check.adb:6:23: positional aggregate cannot have one component
check.adb:6:23: write instead "V => ..."
gnatmake: “check.adb" compilation error

虽然这没关系:

v2 : singleton := (v => 0);

2 个答案:

答案 0 :(得分:6)

圆括号表达式的括号是多余的,因此(0)= 0并且它是一个整数而不是数组聚合。

因此,对于单元素聚合的特殊情况,需要使用命名关联来区分聚合和简单值。

将此与(0,0)对比,后者只能是聚合;因此没有歧义。

即使在问题的背景下,对于人类程序员而言,这是显而易见的,并非总是如此。

考虑多维数组中的单元素聚合,它是记录的一个字段;可能存在编译器无法解决的歧义(至少在阅读更多的源文件之前!)并且会让阅读该程序的人生活变得非常困难。

答案 1 :(得分:0)

您不必使用命名表示法。

v1 : singleton := (others => 0);

这将为v1中的所有元素分配0,编译器将知道这不是数字而是数组。

如果记录碰巧有不同类型,您可以使用

v1 : singleton := (others => <>);