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

Pav*_*ska 2 ada

我在理解UFCS(通用函数调用语法)如何在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;
Run Code Online (Sandbox Code Playgroud)

然后我可以调用该过程,就好像它实际上属于Person类型:

Some_Person_Instance.Say_Name;
Run Code Online (Sandbox Code Playgroud)

现在这样可行,但在我的特定实例中,拥有一条记录是没有意义的,一个子类型就足够了.

subtype Person is String;
Run Code Online (Sandbox Code Playgroud)

此时(假设我改变了程序的工作方式),它无法编译,我收到错误:

invalid prefix in selected component "Person".
Run Code Online (Sandbox Code Playgroud)

为什么?如果我这样做,它甚至没有帮助:

type Person is new String;
Run Code Online (Sandbox Code Playgroud)

UFCS只适用于记录吗?

如果这是一个无聊的问题,我很抱歉,但我没有为Ada学习材料(除了几本电子书),我订购的教科书还没有到.

Sim*_*ght 5

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;
Run Code Online (Sandbox Code Playgroud)

可能就是一个例子!


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