如此处所述,包中的函数以及类中的静态方法仍然需要为每个packagename.functionname
函数使用语法或(因为导入是函数工作区的一部分,而不是全局的)。这意味着稍后更改包/类名称可能会变得乏味。import packagename.*
有没有办法做类似的事情
import this.*
,即一个包/类名不可知的方法来访问同一个包/类中的所有函数/静态方法?
如此处所述,包中的函数以及类中的静态方法仍然需要为每个packagename.functionname
函数使用语法或(因为导入是函数工作区的一部分,而不是全局的)。这意味着稍后更改包/类名称可能会变得乏味。import packagename.*
有没有办法做类似的事情
import this.*
,即一个包/类名不可知的方法来访问同一个包/类中的所有函数/静态方法?
所以...这不需要 importthis 也被导入吗?或者 importthis 是您在路径中始终拥有的功能?
在每个函数的顶部粘贴一个带有 this 的“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
我最近遇到了类似的问题,并找到了以下软件包解决方案。但是它非常hacky。
您可以使用可选参数创建一个名为 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
编辑该字符串以导入“this”包。因此,在您的包函数中,您可以将以下内容放在顶部附近:
function B = myfunc(A)
eval(importthis);
%function body
end
你也可以传递who
给importhis
,让你的函数的命名空间保持干净。
function B = myfunc(A)
eval(importthis(who));
%function body
end
我无法决定是否应该为自己的所作所为感到自豪或怀疑。
这可能不是一个值得赏金的答案,但由于您没有任何答案,我想我还是会发布它!您可以通过只需要定义一次的类的实例来调用静态方法。您可以通过函数句柄调用函数,但这需要每个函数一个句柄。
使用这些技术,您可以在一处定义所有静态方法和函数引用。然后,您将在整个包中使用这些引用。然后,如果您决定稍后更改包名称,您只需要更新这些都存储在一个地方的引用。
看:
您还可以使用类的实例调用静态方法,就像任何方法一样:
obj = 我的班级;
值 = obj.pi(.001);
下面的示例为驼峰函数创建一个函数句柄并将其分配给变量 fhandle。
fhandle = @humps;