Нет, это невозможно. M-файлы ищутся только в самой директории Foo
, а в подкаталогах - нет. Исключением является подкаталог с именем private
, который может содержать функции M-файла, видимые только для M-файлов в его родительском каталоге ( документация ).
Publi c методы все должны быть прямо в каталоге Foo
. Закрытые методы могут быть в подкаталоге private
. Методы Stati c должны быть определены в файле classdef
.
В общем случае ваша структура каталогов может выглядеть следующим образом:
@Foo/
├──Foo.m
├──A.m
├──B.m
├──private/
│ ├──X.m
│ ├──Y.m
Foo.m
должна содержать classdef
определение класса Foo
(или, если вы go с классом pre-classdef, просто метод конструктора, хотя это не рекомендуется). Определение classdef
содержит все методы, установщики и получатели stati c, а также все методы, которым требуются специальные разрешения доступа. Функции A
и B
являются опубликованными c методами Foo
. X
и Y
- это функции, доступные для любого кода в Foo.m
, A.m
, B.m
, X.m
и Y.m
.
Для структурирования вашего кода вы можете взять более длинные функции и разделить их как частные подфункции, оставив не намного больше, чем его объявление в classdef
:
classdef ClassName
properties
...
end
methods
function obj = C(obj,vararg)
obj = C_internal(obj,vararg{:});
end
end
и в файле private/C_internal.m
:
function obj = C_internal(obj,arg2,arg3,arg4,...)
...
end
(обратите внимание на использование vararg
, которое предотвращает повторение списка аргументов, дублированные списки аргументов являются хорошим способом введения ошибок.)
Единственная проблема здесь заключается в том, что документация все еще должна находиться в Foo.m
. Лично мне не нравится отделять код от документации, и я предпочитаю хранить их вместе в одном файле.