Первая функция в m-файле (то есть основная функция ) вызывается при вызове этого m-файла. Не обязательно , чтобы основная функция имела то же имя, что и m-файл, но для ясности она должна . Когда функция и имя файла различаются, имя файла должно использоваться для вызова основной функции.
Все последующие функции в m-файле, называемые локальными функциями (или «подфункциями» в более старой терминологии), могут вызываться только основной функцией и другими локальными функциями в этом m-файле. Функции в других m-файлах не могут вызывать их. Начиная с R2016b, вы также можете добавлять локальные функции в сценарии , хотя поведение области действия остается прежним (то есть их можно вызывать только из сценария).
Кроме того, вы также можете объявить функции в других функциях. Они называются вложенными функциями и могут вызываться только из той функции, в которую они вложены. Они также могут иметь доступ к переменным в функциях, в которые они вложены, что делает их весьма полезными, хотя и немного сложными для работы.
Больше пищи для размышлений ...
Есть несколько способов , вокруг нормального поведения функции обзорного , описанных выше, такие как прохождение функции ручки в качестве выходных аргументов , как указано в ответах от SCFrench и Джонаса (который, начиная с R2013b, облегчаются с помощью localfunctions
функции). Однако я бы не советовал прибегать к таким уловкам, так как, вероятно, есть гораздо лучшие варианты для организации ваших функций и файлов.
Например, предположим, что у вас есть основная функция A
в м-файле A.m
, наряду с локальными функциями D
, E
и F
. Теперь предположим, что у вас есть два других связанных с ними функций B
и C
в м-файлов B.m
и C.m
, соответственно, что вы хотите быть в состоянии назвать D
, E
и F
. Вот несколько вариантов, которые у вас есть:
Положите D
, E
и F
каждый в свои отдельные m-файлы, позволяя любой другой функции вызывать их. Недостатком является то, что сфера применения этих функций велик и не ограничивается только A
, B
и C
, но вверх, что это довольно просто.
Создайте defineMyFunctions
m-файл (как в примере с Jonas) с помощью D
, E
и F
как локальные функции и как главную функцию, которая просто возвращает им дескрипторы функций. Это позволяет сохранить D
, E
и F
в том же файле, но это ничего не делать в отношении объема этих функций , так как любая функция , которая может вызывать defineMyFunctions
их вызова. Затем вам также придется позаботиться о передаче дескрипторов функции в качестве аргументов, чтобы убедиться, что они есть там, где они вам нужны.
Скопируйте D
, E
и F
в B.m
и C.m
как локальные функции. Это ограничивает область их использования просто A
, B
и C
, но делает обновление и обслуживание вашего кода кошмаром, потому что у вас есть три копии одного и того же кода в разных местах.
Используйте частные функции ! Если у вас есть A
, B
и C
в том же каталоге, вы можете создать подкаталог private
и место D
, E
и F
там, каждый как отдельный м-файл. Это ограничивает сферу их применения , так что они могут быть вызваны только функциями в каталоге непосредственно выше (то есть A
, B
и C
) и держит их вместе в одном месте (но все же разные м-файлы):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Все это выходит за рамки вашего вопроса и, вероятно, более детально, чем вам нужно, но я подумал, что было бы неплохо затронуть более общую проблему организации всех ваших m-файлов. ;)
^
: @idigas