2017-09-13 16 views
8

Trong MATLAB, bạn có thể có nhiều hàm trong một tệp .m. Tất nhiên có chức năng chính, và sau đó là nested or local functions.Có nhiều chức năng trong một tệp .m được lồng hoặc cục bộ khi "kết thúc" không được sử dụng

Ví dụ về từng loại chức năng:

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

Sự khác biệt là rõ ràng khi bạn sử dụng end báo cáo của các chức năng. Tuy nhiên, tôi không nghĩ rằng đó là tài liệu rõ ràng mà bạn đang sử dụng khi bạn không, vì đây là cú pháp hợp lệ:

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

Có bất kỳ định nghĩa rõ ràng về việc liệu các chức năng bằng văn bản như myotherfunc là địa phương hoặc lồng nhau?

Trả lời

8

này có thể nhanh chóng thử nghiệm vì sự khác biệt phạm vi biến mentioned in the documentation

Sự khác biệt chính giữa các chức năng lồng nhau và chức năng địa phương là chức năng lồng nhau có thể sử dụng các biến được định nghĩa trong các chức năng mẹ mà không đi một cách rõ ràng những biến làm đối số.

Vì vậy, thích ứng ví dụ câu hỏi:

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; 

này sai lầm vì myotherfunc là trong thực tế, một chức năng địa phương, không phải là một chức năng lồng nhau.

Xét nghiệm này được hỗ trợ bởi documentation for nested functions trong đó nêu:

Thông thường, chức năng không đòi hỏi một tuyên bố end. Tuy nhiên, để làm tổ mọi chức năng trong tệp chương trình, tất cả các chức năng trong tệp đó phải sử dụng câu lệnh end.

Các vấn đề liên quan