Вложенная функция является функцией, которая полностью содержится в родительской функции. Любая функция в программном файле может включать вложенную функцию.
Например, эта функция с именем 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
для
в то время как
, или 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
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
Самый легкий способ расширить осциллограф вложенной функции состоит в том, чтобы создать указатель на функцию и возвратить его как выходной аргумент, как показано в Использовании Указателей, чтобы Сохранить Параметры функции. Только функции, которые могут вызвать вложенную функцию, могут создать указатель на нее.