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

时间:2014-07-16 20:25:39

标签: 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;

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

Some_Person_Instance.Say_Name;

现在这样可行,但在我的特定情况下,拥有一条记录是没有意义的,一个子类型就足够了。

subtype Person is String;

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

invalid prefix in selected component "Person".

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

type Person is new String;

UFCS是否只适用于记录?

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

1 个答案:

答案 0 :(得分:5)

UFCS是full feature of the D language。由于历史原因,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示例(来自here

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

可能就是一个例子!


关于学习Ada和Web资源,请查看Ada Resource Association’s resource list