我在理解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的学习材料(除了几本电子书),我订购的教科书还没有到达。
答案 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。