当聚合只包含一个元素时,如下所示,位置表示法会导致编译错误,我们只能使用命名表示法.为什么?
type singleton is record
v : integer;
end record;
v1 : singleton := (0);
Run Code Online (Sandbox Code Playgroud)
导致编译器消息
check.adb:6:23: positional aggregate cannot have one component
check.adb:6:23: write instead "V => ..."
gnatmake: “check.adb" compilation error
Run Code Online (Sandbox Code Playgroud)
这没关系:
v2 : singleton := (v => 0);
Run Code Online (Sandbox Code Playgroud)
圆表达式的圆括号是多余的,因此(0)= 0并且它是整数而不是数组聚合.
因此,对于单元素聚合的特殊情况,需要使用命名关联来区分聚合和简单值.
将此与(0,0)对比,后者只能是聚合; 因此没有歧义.
即使在问题的背景下,对于人类程序员而言,这是显而易见的,并非总是如此.
考虑多维数组中的单元素聚合,它是记录的一个字段; 可能存在编译器无法解决的歧义(至少,在阅读更多的源文件之前!)并且会让阅读该程序的人生活变得非常困难.