exponenta event banner

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

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

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

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

В командной строке вызовите 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

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

Связанные темы