通过点操作符调用基本操作失败



我有一个问题,了解如何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)

然而,标记类型的基本子程序可以以两种方式调用;或者作为普通调用,或者,如果标记的参数是第一个参数,使用前缀表示法(ARM 4.1.3(9.1))。

本设计在AI95-00252中有讨论;显然,设计师确实考虑过允许所有类型的调用表单,但这样做的复杂性太多,好处太少。很遗憾,我想我们都同意,虽然这可能有些过头了;D的例子(从这里)

values.multiply(10).divide(3).evens.writeln;

可能就是一个很好的例子!


关于学习Ada和Web资源,请查看Ada资源协会的资源列表。

最新更新