本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

嵌套函数

什么是嵌套函数?

嵌套函数是完全包含在父函数内的函数。程序文件中的任何函数都可以包含嵌套函数。

例如,名称为 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/elseswitch/caseforwhiletry/catch

  • 必须按名称直接调用嵌套函数,而不使用 feval 或使用您使用 @ 运算符创建的函数句柄(并不是 str2func)。

  • 嵌套函数或包含嵌套函数的函数中的所有变量都必须显式定义。即,除非变量已存在于函数工作区中,否则无法调用函数或脚本向那些变量赋值。(有关详细信息,请参阅嵌套函数和匿名函数中的变量。)

在父函数与嵌套函数之间共享变量

通常,一个函数工作区中的变量不可用于其他函数。但是,嵌套函数可以访问和修改它们所在的函数工作区中的变量。

这意味着嵌套函数及包含它的函数都可以修改同一变量,不必将该变量作为参数传递。例如,在 main1main2 函数的每个函数中,主函数和嵌套函数都可以访问变量 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 函数的句柄,该函数包含系数 abc 的值。

在命令行中,调用具有系数值 1.3.230makeParabola 函数。使用返回的函数句柄 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 可以调用 BD,但不能调用 CE。)

  • 在同一父函数内的同一级别嵌套的函数中。(函数 B 可以调用 D,而 D 可以调用 B。)

  • 任何更低级别的函数中。(函数 C 可以调用 BD,但不能调用 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

扩大嵌套函数作用域的最简单的方式是创建函数句柄并将其作为输出参数返回,如使用句柄存储函数参数中所示。只有能调用嵌套函数的函数才可以创建该嵌套函数的句柄。

相关主题