如上所述[{3}},包中的函数以及类中的静态方法仍然需要使用packagename.functionname
语法或import packagename.*
用于每个函数(因为导入是函数工作空间的一部分而不是全局的)。这意味着稍后更改包/类名可能会成为一种繁琐的麻烦。
有没有办法像
import this.*
这样的东西,即一个包/类名不可知的方法来访问同一个包/类中的所有函数/静态方法?
答案 0 :(得分:7)
所以...这不需要导入也可以导入吗?或者是importt这是你在路上一直有的功能吗?
在每个函数的顶部粘贴一个“import this”块似乎并不复杂,然后你不必担心导入它在你的路径中。我倾向于认为依赖路径是危险的。
%% 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
答案 1 :(得分:4)
我最近遇到了类似的问题,并找到了以下解决方案。然而,它非常黑客。
使用可选参数创建一个名为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
输入"这个"包。因此,在您的包函数中,您可以将以下内容放在顶部附近:
function B = myfunc(A)
eval(importthis);
%function body
end
您也可以将who
传递给importhis
,让您的功能名称空间保持清洁。
function B = myfunc(A)
eval(importthis(who));
%function body
end
我无法决定是否应该为自己所做的事感到骄傲或沮丧。
答案 2 :(得分:3)
这可能不是一个值得回答的答案,但由于你没有任何答案我认为我会发布它!您可以通过类的实例调用静态方法,您只需要定义一次。您可以通过函数句柄调用函数,但这需要每个函数一个句柄。
使用这些技术,您可以在一个地方定义所有静态方法和函数引用。然后,您将在整个包中使用这些引用。然后,如果您决定稍后更改包名称,则只需更新这些存储在一个地方的引用。
请参阅:
您还可以使用类的实例调用静态方法, 像任何方法一样:
obj = MyClass;
value = obj.pi(.001);
以下示例为humps函数创建函数句柄 并将其分配给变量fhandle。
fhandle = @humps;