前言
本文介绍了一种函数与函数之间相互传递参数的方法,可以方便的实现函数与函数之间传递参数,并且不会产生混乱,更不会导致全局变量的滥用。本文所编写的程序使用MATLAB语言,对其他编程语言也可以借鉴其思想。
背景
一般的函数与函数传递参数使用形参输入,但是这种方法导致形参固定(或者可变),需要程序对输入变量进行解析,而且必须相互调用才能传递参数,这样传递参数的效率很低,而且很不方便。最常见的方法为定义全局变量,然后在每个函数中声明全局变量,但是这种方法常常导致全局变量的滥用,容易导致变量的重名和混淆,不利于程序的模块化编程。本文介绍的传递参数方法虽然也是使用的全局变量,但是在使用时是利用一套函数对全局变量进行操作,实现函数与函数传递变量更加灵活和安全。
介绍
本方法利用一套函数对全局变量操作,可以实现以下功能:
- 函数与函数之间的定点发送,其他函数不能接收到
- 函数与所有函数之间的广播发送,所有函数均能收到
- 取消传递的参数
函数用法示例
利用历史计算结果加速重复调用函数时的调用速度
名称为fun1的函数发送给自身消息,例如fun1功能为执行特定的计算,并将计算得到的结果输出。且该函数的计算结果(输出)在多处使用到,由于程序由多个函数组成,且经常形成函数互相调用的情况。因此,当其他函数需要使用fun1输出的计算结果时,常常由于函数之间多层调用的关系获取不到fun1的输出结果。为了避免其他函数调用fun1从而导致重复执行fun1的情况,利用将消息发送给自身的方法,提高效率。
function [res1,res2] = fun1(par1,flush)
% 当输入为两个参数时,将重新计算;可控制是否重复执行该函数
if nargin > 1
messages_clear( 'fun1' );
end
%%%%%%%%%%%%%%%%%%%%%%%%
% 获取消息,首次执行该函数时消息为空,执行函数的具体内容
message = message_get();
% 首次执行该函数的最后部分将计算结果发送给自身,因此非首次进入时直接获取首次执行结果,并返回函数,避免了多次运行该函数,提高了运行效率
if isfield( message, 'res1' ) && isfield( message, 'res2' )
res1= message.res1;
res2= message.res2;
return ;
end
%%%%%%%%%%%%%%%%%%%%%%%%%
% 函数执行的具体内容,用于输出结果的计算
%%%%%%%%%%%%%%%%%%%%%%%%%
% 将结果发送给自身,导致本函数仅执行首次,第二次进入时直接获取消息
messages_sendto( 'fun1', 'res1', res1);
messages_sendto( 'fun1', 'res2', res2);
这种使用方法包含三要素:
- 是否控制函数重新计算,有时可能需要函数重新计算,舍去历史计算的结果
- 检查是否自身发送的结果,当存在时直接读取
- 最后将计算的结果发送给本身,加快调用速度