嵌套函数
什么是嵌套函数?
嵌套函数是完全包含在父函数内的函数。程序文件中的任何函数都可以包含嵌套函数。
例如,名称为 parent
的函数包含名称为 nestedfx
的嵌套函数:
function parent disp('This is the parent function') nestedfx function nestedfx disp('This is the nested function') end end
嵌套函数与其他类型的函数的主要区别是,嵌套函数可以访问和修改在其父函数中定义的变量。因此:
嵌套函数可以使用不是以输入参数形式显式传递的变量。
在父函数中,您可以为嵌套函数创建包含运行嵌套函数所必需的数据的句柄。
嵌套函数的要求
嵌套函数通常不需要
end
语句。但是,要在程序文件中嵌套任何函数,该文件中的所有函数都必须使用end
语句。不能在任何 MATLAB® 程序控制语句内定义嵌套函数,例如
if/elseif/else
、switch/case
、for
、while
或try/catch
。必须按名称直接调用嵌套函数,而不使用
feval
或使用您使用@
运算符创建的函数句柄(并不是str2func
)。嵌套函数或包含嵌套函数的函数中的所有变量都必须显式定义。即,除非变量已存在于函数工作区中,否则无法调用函数或脚本向那些变量赋值。(有关详细信息,请参阅解决错误:尝试向静态工作区添加变量。。)
在父函数与嵌套函数之间共享变量
通常,一个函数工作区中的变量不可用于其他函数。但是,嵌套函数可以访问和修改它们所在的函数工作区中的变量。
这意味着嵌套函数及包含它的函数都可以修改同一变量,不必将该变量作为参数传递。例如,在 main1
和 main2
函数的每个函数中,主函数和嵌套函数都可以访问变量 x
:
function main1 x = 5; nestfun1 function nestfun1 x = x + 1; end end | function main2 nestfun2 function nestfun2 x = 5; end x = x + 1; end |
如果父函数不使用指定变量,变量保持为嵌套函数的局部变量。例如,在这个名为 main
的函数中,以下两个嵌套函数拥有它们自己的不能彼此交互的 x
版本:
function main nestedfun1 nestedfun2 function nestedfun1 x = 1; end function nestedfun2 x = 2; end end
返回输出参数的函数在其工作区中有这些输出对应的变量。但是,父函数只有在显示请求嵌套函数的输出对应的变量时,父函数才具有这些变量。例如,函数 parentfun
在其工作区中没有变量 y
:
function parentfun x = 5; nestfun; function y = nestfun y = x + 1; end end
如果您修改如下所示的代码,变量 z
位于 parentfun
的工作区中:
function parentfun x = 5; z = nestfun; function y = nestfun y = x + 1; end end
使用句柄存储函数参数
嵌套函数可以使用以下三个来源的变量:
输入参数
在嵌套函数内定义的变量
在父函数中定义的变量,还称为外部作用域变量。
为嵌套函数创建函数句柄时,该句柄不仅存储函数名称,还存储外部作用域变量的值。
例如,在名为 makeParabola.m
的文件中创建一个函数:该函数接受几个多项式系数,并返回嵌套函数的句柄以计算该多项式的值。
function p = makeParabola(a,b,c) p = @parabola; function y = parabola(x) y = a*x.^2 + b*x + c; end end
makeParabola
函数返回 parabola
函数的句柄,该函数包含系数 a
、b
和 c
的值。
在命令行中,调用具有系数值 1.3
、.2
和 30
的 makeParabola
函数。使用返回的函数句柄 p
计算多项式在特定点处的值:
p = makeParabola(1.3,.2,30); X = 25; Y = p(X)
Y = 847.5000
许多 MATLAB 函数接受函数句柄输入以计算特定值范围内的函数。例如,绘制从 -25
到 +25
的抛物型方程:
fplot(p,[-25,25])
可以为 parabola
函数创建多个句柄,其中每个句柄使用不同的多项式系数:
firstp = makeParabola(0.8,1.6,32); secondp = makeParabola(3,4,50); range = [-25,25]; figure hold on fplot(firstp,range) fplot(secondp,range,'r:') hold off
嵌套函数的可见性
每个函数都有特定的作用域,即可以看到该函数的一组其他函数。嵌套函数在以下位置可用:
紧邻的上一级。(在下面的代码中,函数
A
可以调用B
或D
,但不能调用C
或E
。)在同一父函数内的同一级别嵌套的函数中。(函数
B
可以调用D
,而D
可以调用B
。)任何更低级别的函数中。(函数
C
可以调用B
或D
,但不能调用E
。)function A(x, y) % Main function B(x,y) D(y) function B(x,y) % Nested in A C(x) D(y) function C(x) % Nested in B D(x) end end function D(x) % Nested in A E(x) function E(x) % Nested in D disp(x) end end end
扩大嵌套函数作用域的最简单的方式是创建函数句柄并将其作为输出参数返回,如使用句柄存储函数参数中所示。只有能调用嵌套函数的函数才可以创建该嵌套函数的句柄。