Ada 2005中Euler实例化与调用参数数量不一致的疑问
Ada泛型实例化与过程调用的参数区别
你混淆了泛型实例化的类型参数和实例化后过程的调用参数,这是Ada泛型机制里的核心概念:
- 首先,
Euler是一个泛型过程,它的定义里会声明若干形式类型参数(比如类似type Real is digits <>;、type Vector is private;、type Ptr is access function(X : Real) return Vector;这类)。这些参数用来指定过程操作的类型,不是过程执行时需要传入的数据。 - 语句
procedure Solve is new Euler(Real, Vector, Ptr);是泛型实例化:用你代码里定义的具体类型Real、Vector、Ptr去替换Euler的形式类型参数,生成一个针对该类型组合的具体过程Solve。这一步的参数是类型,不是运行时数据。 - 实例化后的
Solve过程本身有4个运行时参数(从你的调用语句看:一个符合Ptr类型的函数访问值、两个Real类型的数值、一个Vector类型的输出参数),所以调用Solve(Ident'Access, 1.0, 0.1, Answer);时传入4个数据参数是完全正常的,和实例化时的类型参数数量没有直接关联。
简单类比:泛型就像一个“模板”,实例化是用具体类型“填充模板”得到具体的过程/函数,而调用这个具体过程时,才需要传入它要求的运行时数据参数。两者是不同阶段的参数,作用完全不同。
内容的提问来源于stack exchange,提问作者Adaenthusiast
相关产品推荐
相关产品推荐

