2016-01-30 9 views
8

La funzione sotto è un hack homegrown per rilevare se il suo argomento si riferisce ad uno script o nonEsiste un test integrato per stabilire se una stringa (o handle) si riferisce a uno script?

function yesno = is_script(string_or_handle) 
    try 
     nargin(string_or_handle); 
     yesno = false; 
    catch me 
     if ~strcmp(me.identifier, 'MATLAB:nargin:isScript') 
      rethrow(me); 
     end 
     yesno = true; 
    end 
end 

Tali hack sono difficili da mantenere. (Questo si interromperà, ad esempio, ogni volta che MathWorks decide di cambiare la classe di identificatore di eccezione che nargin genera quando riceve uno script come input.)

MATLAB ha già una funzione incorporata per fare ciò?

+0

Capisco che vogliate differenziare gli script _da le funzioni_. Il tuo approccio differenzia tra uno script e una funzione che non richiede input? –

+0

Che dire di 'run (che (string_or_handle));' quale errore se non è un file di script standalone? – TroyHaskin

+0

@AndrasDeak True ... – TroyHaskin

risposta

6

È possibile modificare l'attacco per ridurre il rischio di "rottura" futura eseguendo il blocco try-catch solo per gli handle di funzione. In questo caso sapresti che se è un errore se generato, quindi l'handle di input è uno script (non è necessario indagare sui dettagli dell'errore, quindi nessuna sensibilità agli identificatori delle eccezioni).

function yesno = is_script(string_or_handle) 
    yesno = false; 
    if isa(string_or_handle,'function_handle') || ... 
     exist(string_or_handle,'file') == 2 
     try 
      nargin(string_or_handle); 
     catch me 
      yesno = true; 
     end 
    end 
end 
+2

'isa (string_or_handle, 'function_handle')' farebbe anche. – TroyHaskin

+1

@AndrasDeak Il vantaggio qui è che sappiamo che 'nargin' si romperà solo per gli script, quindi non è necessario includere l'identificatore di eccezioni (che la paura dell'OP si interromperà nelle versioni future). – dfri

+3

Oooooh, mi sono perso completamente! Impressionante, buon lavoro :) –

1

Loren da MathWorks ha un blog article circa esattamente questa domanda dal lontano 2013.

Lei usa lo stesso metodo come si fa nella tua domanda - e per quello che vale, l'identificatore del messaggio è lo stesso e non è cambiato da almeno tre anni (in effetti è molto più lungo di così), quindi penso che puoi smettere di preoccuparti della tua soluzione.

Utilmente, Loren aggiunge anche un ulteriore elemento di funzionalità per distinguere i file di classe, oltre a funzioni e script.

+0

Grazie per il puntatore! (Ora sono un po 'orgoglioso del mio piccolo hack.) – kjo