Вложенные функции имеют очень конкретный c вариант использования. Они не предназначены для того, чтобы избежать необходимости передавать данные в функцию в качестве входных и выходных аргументов, что я и пытаюсь сделать. Ваш пример может быть написан с использованием локальных функций :
function fn1
var = 1;
var2 = 2;
[var,var2] = fn4(var,var2);
var2 = fn2(var2);
var,
var2,
end
function var2 = fn2(var2)
var2 = 'I can access var2 from fn1. Happy.'
var = 'a'; % remove local to run this snippet
[var,var3] = fn3(var,var2);
end
function [var,var2] = fn3(var,var2)
var2 = 'I can access var2 from fn1. Happy.'
var = 'fn2 cannot safely use variable name var because it may have been used in fn1. But var is the natural name to use in fn2. Sad.';
var = 1;
var2 = 2;
end
function [var,var2] = fn4(var,var2)
var2 = 'I can also access var2 from fn1. Also happy.'
var = 'If only local scoping works, I would still be able to access var. Would be happy.';
end
Преимущество заключается в том, что размер fn1
значительно уменьшен, он умещается на одном экране и его гораздо легче читать и отлажены. Очевидно, какие функции изменяют какие переменные. И вы можете называть переменные как угодно, потому что ни одна область видимости переменных не выходит за пределы какой-либо функции.
Насколько я знаю, вложенные функции могут быть использованы только для захвата области видимости в лямбда-выражении (дескриптор функции в MATLAB говорят), Вы можете написать функцию, которая создает лямбду (дескриптор вложенной функции), которая захватывает локальную переменную, а затем возвращает эту лямбду вашему вызывающему пользователю для использования. Это мощная функция, но полезная только ситуативно. Помимо этого, я не нашел хорошего использования вложенных функций. Это просто то, что вы должны стараться избегать IMO.
Вот пример лямбды с захваченными данными (на самом деле не проверено, это просто для того, чтобы дать представление; также это довольно глупое приложение, так как MATLAB имеет лучшие способы интерполяции, просто терпите меня). Create2DInterpolator
принимает значения выборки x, y и z. Он использует meshgrid
и griddata
для генерации регулярной двумерной сетки, представляющей эти выборки. Затем он возвращает дескриптор функции, которая интерполирует в этой двумерной сетке, чтобы найти значение z для данных x и y. Этот дескриптор может использоваться вне функции Create2DInterpolator
и содержит созданное нами 2D-представление сетки. По сути, interpolator
является экземпляром класса функторов, который содержит данные. Вы можете реализовать то же самое, написав собственный класс, но для этого потребуется намного больше кода, гораздо больше усилий и дополнительный M-файл. Больше информации можно получить в документации .
interpolator = Create2DInterpolator(x,y,z);
newZ = interpolator(newX,newY);
function interpolator = Create2DInterpolator(x,y,z)
[xData,yData] = meshgrid(min(x):max(x),min(y):max(y));
zData = griddata(x,y,z,xData,yData);
interpolator = @InterolatorFunc;
function z = InterolatorFunc(x,y)
z = interp2(xData,yData,zData,x,y);
end
end