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

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

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

Для примера эта функция называется 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

Использование указателей для хранения параметров функции

Вложенные функции могут использовать переменные из трех источников:

  • Входные параметры

  • Переменные, заданные в вложенной функции

  • Переменные, определенные в родительской функции, также называемые переменными externally scoped

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

Например, создайте функцию в файле с именем makeParabola.m. Эта функция принимает несколько полиномиальных коэффициентов и возвращает указатель на вложенную функцию, которая вычисляет значение этого полинома.

function p = makeParabola(a,b,c)
p = @parabola;

   function y = parabola(x)
   y = a*x.^2 + b*x + c;
   end

end

The 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

Видимость вложенных функций

Каждая функция имеет определенную scope, то есть набор других функций, которым она видна. Доступна вложенная функция:

  • С уровня непосредственно над ним. (В следующем коде выполните функцию 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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте