Pierwsza funkcja w pliku m (tj. Funkcja główna ) jest wywoływana po wywołaniu tego pliku m. Nie jest wymagane, aby funkcja główna miała taką samą nazwę jak plik m, ale dla jasności powinna . Gdy funkcja i nazwa pliku różnią się, nazwa pliku musi być użyta do wywołania funkcji głównej.
Wszystkie kolejne funkcje w pliku m, zwane funkcjami lokalnymi (lub „podfunkcjami” w starszej terminologii), mogą być wywoływane tylko przez funkcję główną i inne funkcje lokalne w tym pliku m. Funkcje innych plików m nie mogą ich wywoływać. Począwszy od wersji R2016b, można również dodawać funkcje lokalne do skryptów , chociaż zachowanie zakresu jest nadal takie samo (tzn. Można je wywoływać tylko ze skryptu).
Ponadto możesz zadeklarować funkcje w ramach innych funkcji. Są to tak zwane funkcje zagnieżdżone i można je wywoływać tylko z funkcji, w której są zagnieżdżone. Mogą również mieć dostęp do zmiennych w funkcjach, w których są zagnieżdżone, co czyni je dość przydatnymi, choć nieco trudnymi w pracy.
Więcej jedzenia do przemyślenia ...
Istnieje kilka sposobów opisanych powyżej normalnego zachowania zakresu funkcji, takich jak przekazywanie uchwytów funkcji jako argumentów wyjściowych, jak wspomniano w odpowiedziach SCFrench i Jonasa (które, począwszy od R2013b, jest ułatwione przez localfunctionsfunkcję). Nie sugeruję jednak, aby nawyk polegał na stosowaniu takich sztuczek, ponieważ prawdopodobnie istnieją znacznie lepsze opcje organizowania funkcji i plików.
Na przykład, powiedzmy, że masz główną funkcję Aw m-pliku A.m, wraz z lokalnych funkcji D, Eoraz F. Teraz załóżmy, że masz dwie inne powiązane funkcje Bi Cw M-Files B.mi C.m, odpowiednio, że chcemy także, aby móc zadzwonić D, Ei F. Oto kilka opcji, które masz:
Umieść D, Ei Fkażdy w osobnych plikach m, umożliwiając wywoływanie ich przez dowolną inną funkcję. Minusem jest to, że zakres tych funkcji jest duża i nie ogranicza się tylko A, Bi C, ale Plusem jest to, że jest to całkiem proste.
Utwórz plik defineMyFunctionsm (jak w przykładzie Jonasa) za pomocą D, Eoraz Fjako funkcje lokalne i główna funkcja, która po prostu zwraca do nich uchwyty funkcji. Pozwala to zachować D, Ei Fw tym samym pliku, ale nie robi nic w odniesieniu do zakresu tych funkcji, ponieważ każda funkcja, która może zostać wywołana, defineMyFunctionsmoże je wywołać. Musisz także obawiać się o przekazanie uchwytów funkcji jako argumentów, aby upewnić się, że masz je tam, gdzie ich potrzebujesz.
Skopiować D, Ea Fdo B.mi C.mjako funkcje lokalnych. To ogranicza zakres ich wykorzystania do właśnie A, Bi C, ale czyni aktualizację i utrzymanie kodu koszmar bo masz trzy kopie tego samego kodu w różnych miejscach.
Korzystaj z funkcji prywatnych ! Jeśli masz A, Boraz Cw tym samym katalogu, można utworzyć podkatalog o nazwie privatei miejsce D, Ei Ftam, każdy jako oddzielny m-pliku. To ogranicza ich zakres, więc mogą być wywoływane tylko przez funkcje w katalogu natychmiast powyżej (tj A, Bi C) i utrzymuje je razem w tym samym miejscu (ale wciąż różne M-Files):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Wszystko to nieco wykracza poza zakres twojego pytania i jest prawdopodobnie bardziej szczegółowe niż potrzebujesz, ale pomyślałem, że dobrze byłoby poruszyć bardziej ogólną troskę o uporządkowanie wszystkich twoich m-plików. ;)
^: @idigas