Подтвердить что ты не робот

Возможна ли самооценка в MATLAB?

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

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

4b9b3361

Ответ 1

Итак... не требует ли импорт importthis также для импорта? Или import import это функция, которую вы всегда имеете на своем пути?

Кажется, что сложнее просто вставить блок "import this" с этим в верхней части каждой функции, и тогда вам не нужно беспокоиться о том, что importthis находится на вашем пути. Я склонен чувствовать, что зависимость от пути опасна.

"Импортировать этот" блок

%% 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

Ответ 2

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

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

См:

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

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

obj = MyClass;

value = obj.pi(.001);

function_handle (@)

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

fhandle = @humps;

Ответ 3

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

Вы создаете функцию, называемую 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

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