2013-01-21 17 views

Odpowiedz

6

+1 za bardzo interesujące pytanie.

Mogę wymyślić sposób na określenie tego. Przetwórz sam wykonany plik m i sprawdź pierwsze słowo w pierwszej nietrywialnej linii bez komentarza. Jeśli jest to słowo kluczowe function, jest to plik funkcji. Jeśli nie, to jest skrypt. Oto schludny jeden-liner:

strcmp(textread([mfilename '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function') 

Uzyskaną wartość powinna wynosić 1, jeśli jest to plik funkcja, i 0, jeśli jest to skrypt.

Należy pamiętać, że ten kod musi być uruchamiany z pliku m, o którym mowa, a nie z osobnego pliku funkcji, oczywiście. Jeśli chcesz utworzyć funkcję rodzajowe z tego (tj jednej, która testuje każdą m-pliku), po prostu przekazać żądaną nazwę pliku ciąg textread, tak:

function y = isfunction(x) 
    y = strcmp(textread([x '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function') 

Aby to funkcja bardziej wytrzymałe można również dodać kod obsługi błędów, który sprawdza, czy plik-m rzeczywiście istnieje przed próbą utworzenia go.

+1

Doskonale, dzięki! – slayton

7

Jest inny sposób. nargin(...) podaje błąd, jeśli jest wywoływany w skrypcie. Następująca krótka funkcja powinna więc spełniać następujące warunki:

function result = isFunction(functionHandle) 
% 
% functionHandle: Can be a handle or string. 
% result:   Returns true or false. 

% Try nargin() to determine if handle is a script: 
try  
    nargin(functionHandle); 
    result = true; 
catch exception 
    % If exception is as below, it is a script. 
    if (strcmp(exception.identifier, 'MATLAB:nargin:isScript'))  
     result = false; 
    else 
     % Else re-throw error: 
     throw(exception); 
    end 
end 

To może nie być najpiękniejszy sposób, ale działa.

Pozdrawiam

+0

To świetnie, dzięki! – slayton

Powiązane problemy