Ada 为什么不';带前缀的呼叫对访问类型有效吗?

Ada 为什么不';带前缀的呼叫对访问类型有效吗?,ada,Ada,我在一个包中有一些方法,这些方法对标记记录的访问常量进行操作;为了调用这些函数,我必须指定包名。我更愿意只输入变量名[dot]函数名,但这会产生错误:对于类型“Color”没有选择器“foo”。为什么呢 这是一个最小的复制器: 过程是主要的 类型颜色已标记 记录 色调:整数; 饱和度:整数; 值:整数; 结束记录; 类型AccessColor是access常量颜色; 程序foo(C:在AccessColor中)是 开始 无效的 完富;; 访问:访问颜色; 开始 foo(access); --Ac

我在一个包中有一些方法,这些方法对标记记录的访问常量进行操作;为了调用这些函数,我必须指定包名。我更愿意只输入变量名[dot]函数名,但这会产生错误:
对于类型“Color”没有选择器“foo”
。为什么呢

这是一个最小的复制器:

过程是主要的
类型颜色已标记
记录
色调:整数;
饱和度:整数;
值:整数;
结束记录;
类型AccessColor是access常量颜色;
程序foo(C:在AccessColor中)是
开始
无效的
完富;;
访问:访问颜色;
开始
foo(access);
--AccessS.foo;——不起作用。为什么?
端干管;
请注意,在我的实际代码中,完全指定函数很不方便,因为与上面的示例不同,foo是在一个单独的包中定义的:

Some.Package.Name.Depp.foo(access);
尽管access已经指定了在何处查找函数,但我应该能够做到:

access.foo;

这不起作用,因为在您定义它时,
foo
不是标记类型
Color
的原始操作。前缀表示法只能用于标记类型的基元操作

解决方案是使
foo
成为
Color
的基本操作,如下所示:

程序foo(C:access常量颜色)为
开始
无效的
完富;;

如果使用命名的访问类型,
foo
将改为该类型的基本操作,并且由于该类型不是标记类型,前缀表示法不起作用。

问题是
foo
实际上不是
颜色的基本操作(在此复制器中)

表示特定类型的基本子程序是

对于在包_规范中立即声明的特定类型,在同一包_规范中立即显式声明并对该类型进行操作的任何子程序(枚举文字除外)

这(为重新格式化、套管调整表示歉意)编译良好

过程是主要的
包装袋是
类型颜色已标记
记录
色调:整数;
饱和度:整数;
值:整数;
结束记录;
程序Foo(C:彩色)为空;
类型AccessColor是access常量颜色;
end Pak;
Col:别名为Pak.Color;
Access:Pak.AccessColor:=Col'Access;
开始
access.Foo;
端干管;
我声明
Foo
采用彩色
;如果需要,您也可以将其声明为take
access constant Color
,因为()

子程序的第一个形式参数应为类型T,或涵盖T的类范围类型,或指定这些类型之一的访问参数


将函数定义更改为指定
access constant Color
作为参数后,在注释的用法行中仍然会出现相同的错误。您可能需要相应地定义
access
。我不确定定义类型
AccessColor
是否会导致类型冻结–它不应该被冻结,而是尝试将其移动到过程下方。请注意:标记类型的对象总是通过引用传递的,因此如果您的目标是避免复制对象,则无需在访问类型上定义
foo
。它也可以使用彩色的
来获得相同的结果。为什么要使用访问类型?几乎不需要它们。这显然不需要它们。