我有一个问题,了解如何ucs(通用函数调用语法)在Ada工作。
假设我有一个类型,比如:
package People
type Person is tagged private;
-- This procedure is a primitive operation:
procedure Say_Name (Person_Object : in Person);
private
type Person is tagged record
Name : String;
end record;
end People;
,那么我就可以调用这个过程,就好像它实际上属于Person类型:
Some_Person_Instance.Say_Name;
现在工作了,但在我的特定实例中,没有意义的记录,和一个子类型就足够了。
subtype Person is String;
在这一点上(假设我改变了过程的工作方式),它无法编译,我得到了错误:
invalid prefix in selected component "Person".
为什么?如果我这样做,它甚至没有帮助:
type Person is new String;
UFCS只适用于记录吗?
如果这是一个空洞的问题,我很抱歉,但是我没有给Ada的学习资料(除了几本电子书),我订购的教科书还没有到。
UFCS是D语言的一个完整特性。由于历史原因,Ada在语言的不同部分使用了混合的调用方法。
普通的子程序调用在ARM 6.4中处理,看起来像Subprogram_Name (Parameters)
(或者如果没有参数就只是Subprogram_Name
)。
受保护的子程序调用(ARM 9.5.1)和入口调用(ARM 9.5.3)看起来像Object.Subprogram_Or_Entry_Name (Parameters)
。
本设计在AI95-00252中有讨论;显然,设计师确实考虑过允许所有类型的调用表单,但这样做的复杂性太多,好处太少。很遗憾,我想我们都同意,虽然这可能有些过头了;D的例子(从这里)
values.multiply(10).divide(3).evens.writeln;
可能就是一个很好的例子!
关于学习Ada和Web资源,请查看Ada资源协会的资源列表。