23

如此处所述,包中的函数以及类中的静态方法仍然需要为每个packagename.functionname函数使用语法或(因为导入是函数工作区的一部分,而不是全局的)。这意味着稍后更改包/类名称可能会变得乏味。import packagename.*

有没有办法做类似的事情import this.*,即一个包/类名不可知的方法来访问同一个包/类中的所有函数/静态方法?

4

3 回答 3

7

所以...这不需要 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
于 2012-11-14T00:38:26.640 回答
4

我最近遇到了类似的问题,并找到了以下软件包解决方案。但是它非常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

你也可以传递whoimporthis,让你的函数的命名空间保持干净。

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

我无法决定是否应该为自己的所作所为感到自豪或怀疑。

于 2012-02-01T17:54:17.307 回答
3

这可能不是一个值得赏金的答案,但由于您没有任何答案,我想我还是会发布它!您可以通过只需要定义一次的类的实例来调用静态方法。您可以通过函数句柄调用函数,但这需要每个函数一个句柄。

使用这些技术,您可以在一处定义所有静态方法和函数引用。然后,您将在整个包中使用这些引用。然后,如果您决定稍后更改包名称,您只需要更新这些都存储在一个地方的引用。

看:

调用静态方法

您还可以使用类的实例调用静态方法,就像任何方法一样:

obj = 我的班级;

值 = obj.pi(.001);

函数句柄 (@)

下面的示例为驼峰函数创建一个函数句柄并将其分配给变量 fhandle。

fhandle = @humps;

于 2011-10-26T07:33:25.330 回答