正如这里所述,即使是包中的函数以及类中的静态方法,仍然需要使用packagename.functionname
语法或者import packagename.*
来引用每个函数(因为导入是函数工作空间的一部分而非全局)。这意味着后续更改包名或类名可能会变得繁琐。
有没有办法实现像
import this.*
这样的东西?也就是说,是否有一种与包名/类名无关的方法可以访问同一包/类中的所有函数/静态方法?
正如这里所述,即使是包中的函数以及类中的静态方法,仍然需要使用packagename.functionname
语法或者import packagename.*
来引用每个函数(因为导入是函数工作空间的一部分而非全局)。这意味着后续更改包名或类名可能会变得繁琐。
有没有办法实现像
import this.*
这样的东西?也就是说,是否有一种与包名/类名无关的方法可以访问同一包/类中的所有函数/静态方法?
所以...这不需要导入importthis吗?或者importthis是你的路径中总是有的函数吗?
似乎只需在每个函数顶部粘贴一个带有此内容的"import this"块,就不必担心importthis是否在您的路径中。我倾向于觉得依赖路径是危险的。
%% Import own package
[~, pkgdir] = fileparts(fileparts(mfilename('fullpath')));
import([pkgdir(2:end) '.*']);
%% 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
mfiledir = fileparts(mfilename); pkg_pos = strfind(mfiledir, [filesep '+']); if ~isempty(pkg_pos), import([strrep(mfiledir((pkg_pos(1)+2):end), [filesep '+'], '.') '.*']); end
- Ken Chatfield我最近遇到了一个类似的问题,并找到了以下关于包的解决方法。然而,这种方法非常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
我无法决定我应该为自己的所作所为感到骄傲还是厌恶。
evalin
但似乎不起作用。也可以在不使用 eval
的情况下获取包|目录名称。您可以抛出一个虚拟异常,捕获它并检查它,因为它包含堆栈跟踪。或者您可以滥用 dbstack
。除此之外,我的解决方案与您链接的解决方案相同。 - AE426082
import
仍然限定于函数/方法的作用域,而不是类定义,并且没有import this.*
。我也没有听说 R2019a 有任何变化。也许是在 R2021a? :) - Andrew Janke