Перша функція m-файлу (тобто основна функція ) викликається при виклику цього m-файлу. Не потрібно, щоб основна функція мала те саме ім'я, що і m-файл, але для наочності це повинно бути . Якщо функція та ім'я файлу різняться, ім'я файлу потрібно використовувати для виклику основної функції.
Усі наступні функції в m-файлі, що називаються локальними функціями (або "підфункціями" у старій термінології), можна викликати лише основною функцією та іншими локальними функціями у цьому m-файлі. Функції в інших m-файлах не можуть їх викликати. Починаючи з R2016b, ви можете додавати локальні функції до сценаріїв , хоча поведінка в масштабі все ще однакова (тобто їх можна викликати лише з сценарію).
Крім того, ви також можете оголошувати функції в межах інших функцій. Вони називаються вкладеними функціями , і їх можна викликати лише з тієї функції, яку вони вкладаються. Вони також можуть мати доступ до змінних у функціях, в яких вони вкладені, що робить їх досить корисними, хоча і трохи складними для роботи.
Більше їжі для роздумів ...
Існують деякі способи навколо поведінки щодо нормального визначення функцій, викладених вище, наприклад, передача ручок функції як вихідних аргументів, як згадується у відповідях SCFrench і Jonas (що, починаючи з 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-файл (як у прикладі Йонаса) за допомогою 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