Несколько функций в одном.M файл вложенный или локальный, когда "end" не используется

в MATLAB вы можете иметь несколько функций в одном . Существует, конечно, основная функция, а затем либо вложенные или локальные функции.

примеры каждого типа функции:

% myfunc.m with local function ------------------------------------------
function myfunc()
    disp(mylocalfunc());
end
function output = mylocalfunc()
    % local function, no visibility of variables local to myfunc()
    output = 'hello world';
end
% -----------------------------------------------------------------------

% myfunc.m with nested function -----------------------------------------
function myfunc()
    disp(mynestedfunc());
    function output = mynestedfunc()
        % nested function, has visibility of variables local to myfunc()
        output = 'hello world';
    end
end
% ----------------------------------------------------------------------

разница ясна, когда вы используете функции'end заявления. Однако я не думаю, что это четко документировано, что вы используете, когда вы этого не делаете, так как это допустимый синтаксис:

% myfunc.m with some other function 
function myfunc()
    disp(myotherfunc());
function output = myotherfunc()
    % It's not immediately clear whether this is nested or local!
    output = 'hello world';

есть ли четкое определение о том, пишутся ли функции как myotherfunc локальные или вложенные?

1 ответов


Это можно быстро проверить из-за различий в области переменных указано в документации

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

Итак адаптации пример:

function myfunc()
    % Define some variable 'str' inside the scope of myfunc()
    str = 'hello world';
    disp(myotherfunc());
function output = myotherfunc()
    % This gives an error because myotherfunc() has no visibility of 'str'!
    output = str;  

это ошибки, потому что myotherfunc is фактически локальная функция, не вложенная функция.

тест поддерживается документация для вложенных функций в которой говорится:

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