Возможна ли самостоятельная ссылка в MATLAB? - PullRequest
23 голосов
/ 12 апреля 2011

Как уже отмечалось здесь , функции в пакетах, а также статические методы в классах по-прежнему должны использовать синтаксис packagename.functionname или import packagename.* для каждой функции (посколькуимпорт является частью рабочей области функции, а не глобальной).Это означает, что изменение имени пакета / класса в дальнейшем может стать утомительной неприятностью.

Есть ли способ сделать что-то вроде import this.*, то есть метод, независимый от имени пакета / класса, для доступа ко всем функциям/ статические методы в одном пакете / классе?

Ответы [ 3 ]

7 голосов
/ 14 ноября 2012

Итак ... разве для этого не нужно импортировать этот файл? Или импорт - это функция, которую вы всегда имеете на своем пути?

Кажется, чуть сложнее просто вставить блок «импортировать это» с этим в верхней части каждой функции, и тогда вам не нужно беспокоиться об импорте, который находится на вашем пути. Я склонен чувствовать, что опора на путь опасна.

Блок «Импортировать это»

%% Import own package
[~, pkgdir] = fileparts(fileparts(mfilename('fullpath')));
import([pkgdir(2:end) '.*']);

Вы даже можете поместить его в блок try / catch, чтобы убедиться, что он находится в каталоге пакета, и решить, что делать, если это не так.

%% Import own package
try
    [~, pkgdir] = fileparts(fileparts(mfilename('fullpath'))); 
    import([pkgdir(2:end)'.*']);
catch err
    if ~strcmp(err.identifier,'MATLAB:UndefinedFunction'), rethrow(err); end
end
4 голосов
/ 01 февраля 2012

Недавно я столкнулся с подобной проблемой и нашел следующее решение для пакетов. Однако это ОЧЕНЬ хакерский.

Вы создаете функцию с именем import this с необязательным аргументом.

function to_eval = importthis(exclude_list)
if nargin == 0
    exclude_list = [];
end
var_name = genvarname('A', exclude_list); %avoid shadowing
to_eval = ['[~,'...
    , var_name...
    , ']=fileparts(fileparts(mfilename(''fullpath'')));'... %get containing dir
    , 'eval([''import '','...
    , var_name...
    , '(2:end),''.*'']);'... %remove '+'
    , 'clear '... %clean up
    , var_name
    ];
end

Эта функция возвращает строку, которая затем может быть eval ed, которая импортирует пакет "this". Таким образом, в ваших функциях пакета вы должны поместить в верхнюю часть следующее:

function B = myfunc(A)
eval(importthis);
%function body
end

Вы также можете передать who в importhis, оставив пространство имен вашей функции чистым.

function B = myfunc(A)
eval(importthis(who));
%function body
end

Я не могу решить, должен ли я гордиться или обсуждать то, что я сделал.

3 голосов
/ 26 октября 2011

Вероятно, это не заслуживающий награды ответ, но, поскольку у вас нет ответов, я решил опубликовать его в любом случае!Вы можете вызывать статические методы через экземпляр класса, который вам нужно будет определить только один раз.Вы можете вызывать функции через дескриптор функции, но для этого потребуется один дескриптор на функцию.

Используя эти методы, вы можете определить все ваши статические методы и ссылки на функции в одном месте.Тогда вы будете использовать эти ссылки во всем пакете.Затем, если вы решили изменить имя пакета на более позднем этапе, вам нужно будет только обновить эти ссылки, которые все хранятся в одном месте.

См .:

Вызов статических методов

Вы также можете вызывать статические методы, используя экземпляр класса, как и любой метод:

obj = MyClass;

value = obj.pi (.001);

function_handle (@)

В следующем примере создается функцияобрабатывает функцию humps и присваивает ее переменной fhandle.

fhandle = @humps;

...