您可以通过让函数向其返回值来分配给变量:My_Int : Integer := My_Math_Func [(optional params)];
或者,您可以通过一个过程来做到这一点(假设已经声明了My_Int
):My_Math_Proc ([optional params;] [in] out My_Int);
显然,过程无法像第一个示例中的函数那样初始化变量,但是我希望找到关于何时以及为什么选择一个的具体规则。
最佳答案
两个让您开始...
当要返回多个结果时,具有多个OUT参数的过程通常是一个不错的选择。
如果在子程序调用之前未知对象的大小,则不能使用OUT参数,因为必须精确地将其声明为正确的大小,但是函数返回可以通过在调用程序中初始化变量来设置大小。这通常与在Declare块中声明的变量一起使用,该变量在每次调用时可以容纳大小不同的字符串。
此示例显示了通过调用Read_File
函数初始化的变量“文本”,以在循环的每次迭代中保存不同文件的内容。安全,不需要“ malloc”或“ free”或指针。 (在此示例中,Filename
是文件名数组)
for i in 1 .. last_file loop
declare
text : String := Read_File(Filename(i));
-- the size of "text" is determined by the file contents
begin
-- process the text here.
for j in text'range loop
if text(j) = '*' then
...
end loop;
end
end loop;
编辑:我想我最好提一下基本的数学原理,因为Ada比许多其他语言更紧密地基于数学逻辑。
函数和过程都是子程序,但是出于不同的目的:
函数是对表达式的抽象:就像数学运算符一样(而Ada中的运算符只是一个函数)。理想情况下,它提供了多个操作数的结果,而没有其他任何操作,使它们保持不变,没有状态且没有副作用。这种理想称为“纯函数”(并应用“ pragma pure”要求编译器检查其纯度)-类似的限制适用于函数式编程(FP)语言。纯函数允许进行大量优化(因为对它们进行重新排序不会改变结果)。实际上,Ada并不那么严格,也允许不纯功能。
过程是对语句的抽象。由于它无法产生结果,因此通常具有某种物理效果(例如更改状态)。
因此,表达式和语句之间的逻辑分离作为功能和过程之间的分离被延续到子程序(抽象)中。
这可能是决定使用哪种方法的最佳方法。