Вложенные функции

Что такое вложенные функции?

Вложенная функция является функцией, которая полностью содержится в родительской функции. Любая функция в программном файле может включать вложенную функцию.

Например, эта функция с именем 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 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.

В командной строке вызовите функцию makeParabola с содействующими значениями 1.3, .2 и 30. Используйте возвращенный указатель на функцию 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

Самый легкий способ расширить осциллограф вложенной функции состоит в том, чтобы создать указатель на функцию и возвратить его как выходной аргумент, как показано в Использовании Указателей, чтобы Сохранить Параметры функции. Только функции, которые могут вызвать вложенную функцию, могут создать указатель на нее.

Похожие темы

Была ли эта тема полезной?