在MATLAB中可以自我引用吗?

时间:2011-04-12 14:37:36

标签: matlab packages self-reference

如上所述[{3}},包中的函数以及类中的静态方法仍然需要使用packagename.functionname语法或import packagename.*用于每个函数(因为导入是函数工作空间的一部分而不是全局的)。这意味着稍后更改包/类名可能会成为一种繁琐的麻烦。

  

有没有办法像import this.*这样的东西,即一个包/类名不可知的方法来访问同一个包/类中的所有函数/静态方法?

3 个答案:

答案 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)

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

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

请参阅:

Calling Static Methods

  

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

     

obj = MyClass;

     

value = obj.pi(.001);

function_handle (@)

  

以下示例为humps函数创建函数句柄   并将其分配给变量fhandle。

     

fhandle = @humps;