我在理解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学习材料(除了几本电子书),我订购的教科书还没有到.
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资源协会的资源列表.