La prima funzione in un file m (cioè la funzione principale ), viene invocata quando viene chiamato quel file m. Non è necessario che la funzione principale abbia lo stesso nome del file m, ma per chiarezza dovrebbe . Quando la funzione e il nome del file differiscono, è necessario utilizzare il nome del file per chiamare la funzione principale.
Tutte le funzioni successive nel file m, chiamate funzioni locali (o " funzioni secondarie" nella terminologia precedente), possono essere chiamate solo dalla funzione principale e da altre funzioni locali in quel file m. Le funzioni in altri file m non possono chiamarle. A partire da R2016b, è possibile aggiungere anche funzioni locali agli script , sebbene il comportamento dell'ambito sia sempre lo stesso (ovvero possono essere richiamati solo all'interno dello script).
Inoltre, è anche possibile dichiarare funzioni all'interno di altre funzioni. Queste sono chiamate funzioni nidificate e possono essere chiamate solo all'interno della funzione in cui sono nidificate. Possono anche avere accesso a variabili nelle funzioni in cui sono nidificati, il che le rende abbastanza utili seppur leggermente complicate con cui lavorare.
Più spunti di riflessione ...
Esistono alcuni modi per aggirare il normale comportamento dell'ambito delle funzioni descritto sopra, come passare gli handle di funzione come argomenti di output come menzionato nelle risposte di SCFrench e Jonas (che, a partire da R2013b, è facilitato dalla localfunctions
funzione). Tuttavia, non consiglierei di prendere l'abitudine di ricorrere a tali trucchi, poiché probabilmente ci sono opzioni molto migliori per organizzare le tue funzioni e i tuoi file.
Ad esempio, supponiamo che tu abbia una funzione principale A
in un file m A.m
, insieme alle funzioni localiD
, E
e F
. Ora diciamo che si dispone di altre due funzioni correlate B
e C
in m-file B.m
e C.m
, rispettivamente, che si vuole anche essere in grado di chiamare D
, E
e F
. Ecco alcune opzioni che hai:
Inserisci D
, E
e F
ciascuno nei propri m-file separati, consentendo a qualsiasi altra funzione di chiamarli. Il lato negativo è che la portata di queste funzioni è grande e non è limitato al solo A
, B
e C
, ma il lato positivo è che questo è abbastanza semplice.
Creare un defineMyFunctions
M-file (come nell'esempio di Jonas') con D
, E
e F
come funzioni locali e una funzione principale che semplicemente restituisce funzione gestisce a loro. Ciò consente di conservare D
, E
e F
nello stesso file, ma non fa nulla per quanto riguarda l'ambito di queste funzioni poiché qualsiasi funzione che può chiamare defineMyFunctions
può invocarle. Inoltre, devi preoccuparti di passare gli handle di funzione come argomenti per assicurarti di averli dove ti servono.
Copia D
,E
e F
in B.m
e C.m
come funzioni locali. Questo limita la portata del loro utilizzo a poco A
, B
e C
, ma rende l'aggiornamento e la manutenzione del codice un incubo perché avete tre copie dello stesso codice in luoghi diversi.
Usa le funzioni private ! Se si dispone A
, B
e C
nella stessa directory, è possibile creare una sottodirectory chiamata private
e luogo D
, E
eF
lì dentro, ciascuno come un m-file separato. Questo limita il campo di applicazione in modo che possano essere chiamati solo da funzioni nella directory immediatamente sopra (vale a dire A
, B
e C
) e li tiene insieme nello stesso luogo (ma ancora diverse m-files):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Tutto questo va un po 'al di fuori dell'ambito della tua domanda, ed è probabilmente più dettagliato di quello che ti serve, ma ho pensato che potrebbe essere utile toccare la preoccupazione più generale di organizzare tutti i tuoi file m. ;)
^
, @idigas