2017-09-13 80 views
8

W MATLAB możesz mieć wiele funkcji w jednym pliku .m. Istnieje oczywiście główna funkcja, a następnie nested or local functions.Wiele funkcji w jednym pliku .m zagnieżdżonym lub lokalnym, gdy "koniec" nie jest używany.

Przykłady każdego rodzaju funkcję:

% 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 
% ---------------------------------------------------------------------- 

Różnica jest jasne, kiedy używasz end oświadczenia funkcji. Jednak nie sądzę, to wyraźnie udokumentowane których używasz, kiedy nie, ponieważ jest to ważny składnia:

% 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'; 

Czy istnieje jasne określenie, czy funkcje napisane jak myotherfunc są lokalne lub zagnieżdżone?

Odpowiedz

8

Można to szybkie badanie z powodu zmiennych różnic zakres mentioned in the documentation

Podstawowa różnica między zagnieżdżone oraz funkcje lokalnych jest zagnieżdżenia może wykorzystywać zmienne określone funkcje macierzystych bez wyraźnego przekazaniem tych zmiennych jako argumenty.

Więc dostosowania przykład pytanie:

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; 

Te błędy ponieważ myotherfunc w rzeczywistości jest lokalna funkcja, a nie funkcja zagnieżdżona.

Test jest obsługiwany przez documentation for nested functions który stwierdza:

Zazwyczaj funkcje nie wymagają oświadczenie end. Jednak zagnieździć dowolny funkcja w pliku programu, wszystkie funkcje w tym pliku należy użyć end oświadczenie.