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