目录
嵌套函数
什么是嵌套函数?
嵌套函数是完全包含在父函数内的函数。程序文件中的任何函数都可以包含嵌套函数。
例如,名称为 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
扩大嵌套函数作用域的最简单的方式是创建函数句柄并将其作为输出参数返回,如使用句柄存储函数参数中所示。只有能调用嵌套函数的函数才可以创建该嵌套函数的句柄。