По правде говоря, я не знаю, что вам действительно следует часто переименовывать свои пакеты.Мне кажется, что вся идея пакета в MATLAB состоит в том, чтобы организовать набор связанных функций и классов в единую коллекцию, которую вы могли бы легко использовать или распространять как «набор инструментов», не беспокоясь остолкновения имен.
Таким образом, размещение функций и классов в пакетах похоже на заключительный шаг, который вы выполняете, чтобы создать хорошую отшлифованную коллекцию инструментов, поэтому у вас действительно не должно быть особых причинпереименовать ваши пакеты.Кроме того, вам нужно будет пройти только один раз, предварительно добавив имя пакета к вызовам функций пакета.
... (пауза, чтобы подумать, является ли то, что я собираюсь предложить, хорошей идеей;))...
Однако, если вы действительно хотите избежать необходимости проходить через ваш пакет и добавлять в вызовы функций новое имя пакета, одним из подходов будет использованиеФункция mfilename
, чтобы получить полный путь к файлу для текущей запущенной функции пакета, проанализировать строку пути, чтобы найти каталоги родительских пакетов (которые начинаются с «+»), а затем передать результат в import
функция для импорта родительских пакетов.Вы можете даже поместить эти шаги в отдельную функцию packagename
(требуя, чтобы вы также использовали функцию evalin
):
function name = packagename
% Get full path of calling function:
callerPath = evalin('caller', 'mfilename(''fullpath'')');
% Parse the path string to get package directories:
name = regexp(callerPath, '\+(\w)+', 'tokens');
% Format the output:
name = strcat([name{:}], [repmat({'.'}, 1, numel(name)-1) {''}]);
name = [name{:}];
end
И затем вы могли бы поместить ее в самыйначало функций вашего пакета, чтобы они автоматически включали в себя пространство имен родительского пакета:
import([packagename '.*']);
Это хорошая идея?Ну, я не уверен, какое влияние окажут вычисления, если вы будете делать каждый раз, когда вы вызываете функцию пакета.Кроме того, если у вас есть пакеты, вложенные в пакеты, вы получите вывод от packagename
, который выглядит следующим образом:
'mainpack.subpack.subsubpack'
И вызов import
будет включать только непосредственный родительский пакет subsubpack
.Если вы также хотите включить другие родительские пакеты, вам придется последовательно удалить последний пакет из вышеуказанной строки и импортировать оставшуюся часть строки.
Короче говоря, это не очень Чистое решение, но с помощью можно сделать вашу посылку таким образом немного проще.Тем не менее, я все же предположил бы, что лучше рассматривать создание пакета как заключительный шаг в процессе создания основного набора инструментов, и в этом случае переименование должно быть маловероятным сценарием, а предварительные вызовы функций пакета с именем пакета будутнужно сделать только один раз.