为什么被命名为一个元素的记录汇总所需的关联?(Why is named association re

2019-10-21 06:31发布

当集合仅包含一个元素,如下,编译错误位置符号的结果,我们必须只使用命名表示法。 为什么?

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);

Answer 1:

括号圆形的表达是冗余的,所以(0)= 0,它是一个整数阵列聚集体。

因此,对于一元集合的特殊情况下,命名关联需要的聚集体从一个简单的值区别开来。

与(0,0),其只能是一个聚合对比这; 因此,没有歧义。

尽管在这个问题的背景下,这是显而易见的并且打算在人类的程序员,这不会永远是这样。

考虑在多维阵列,其是一个记录的一个字段一个一元集合; 可以有编译器不能解决歧义(至少,读了一大堆更多的源文件之前!),并会使任何人读取程序生命相当困难。



Answer 2:

您不必使用命名符号。

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

这将在V1分配0到所有元素和编译器将知道是不是一个号码,但阵列来代替。

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

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


文章来源: Why is named association required for a one-element record aggregate?
标签: record ada