所以我们知道Ada支持像这样的默认参数
procedure Example(param1 : Integer := 1);
但是我的问题是,默认参数在哪里计算?在我熟悉的所有语言中,默认参数仅插入到调用代码中,如果更改了默认参数,则需要下游重新编译。 Ada是否使用相同的方法?
我尝试搜索ARM 2012,但在整个文档的任何地方都找不到“默认参数”。因此,然后我检查了6.4和6.4.1,其中ARM似乎将相关部分称为“默认表达式”。但是,“默认表达式”链接到3.7判别式。这可能可以用来减少定义某些内容的次数,但是,如果这是两个概念的共同点,那么他们应该做程序员应该做的事情,并分别进行定义。这种跳跃令人困惑,并且似乎是一个错误。
说明59如下:
创建类型不受限制的子类型的对象时,将评估该类型的判别式的default_expression。
好吧,这对于子例程调用没有任何意义。
那么,子例程的“默认表达式”何时真正得到计算?
答案 0 :(得分:4)
您一直在寻找正确的位置,但是您一定错过了RM 6.4 10/2中的重要部分:
10/2为了执行子程序调用,其名称或前缀 评估呼叫,并评估每个parameter_association (请参见6.4.1)。如果使用default_expression,则隐式 此规则假定为parameter_association。这些评估是 以任意顺序完成。
答案 1 :(得分:2)