那么,在 MATLAB 中有没有一种方法可以修改与当前范围不同的范围的导入列表?也就是说,我希望能够做到这一点:
function import_mypackage()
evalin('caller', 'import mypackage.*');
end
这行不通。调用时没有报错import_mypackage
,但是mypackage中包含的命名空间没有被导入,即:
function foo()
import_mypackage;
g(); % Wanted mypackage.g() but got: Undefined function or variable 'g()'
end
我知道您可以使用eval
或通过将变量传递给import()
. 但是,我找不到任何方法来修改其他范围的导入列表。有什么办法吗?
编辑: Rody Oldenhuis 在他的回答中发现了一个奇怪的函数导入行为。他建议evalin
实际修改调用者的导入列表,但是一旦您从import_mypackage
. 但是,我认为正在发生的事情是import
表达式总是在当前的工作空间中计算。看:
function import_mypackage()
evalin('caller', 'L = import(''mypackage.foo'');');
foo; % It works! So the import happened in this workspace
end
根据罗迪的回应修改:
function foo()
import mypackage.f;
import_mypackage;
L
import
end
将打印:
L =
'mypackage.foo'
ans =
'mypackage.f'
表示 L 被设置为import_mypackage
范围的导入列表,但它从未真正清除foo()
.
编辑: @RodyOldenhuis
我想弄乱调用者范围的导入列表的原因是我想定义一个“别名”版本的import()
. 这alias_import()
将允许用户定义包别名,以便:
alias_import my_toolbox
可能相当于:
import my_toolbox_v1.*
或者:
import my_toolbox_v2.*
也就是说,我希望能够维护工具箱的多个版本并动态控制正在导入的版本。这对于比较不同my_toolbox
版本之间的结果或当您想要确保使用某个my_toolbox
版本时非常有用。每当我升级到新版本的my_toolbox
. 当然,也可以以间接方式进行此操作,例如:
import(alias_import('my_toolbox'))
所以这alias_import
不会执行实际的导入,而只会产生内置的输入import
。这很好,但有点冗长,这就是为什么我想alias_import
修改调用者的导入列表。但是在看到我的奇怪行为之后,evalin()
我想我宁愿让事情像现在这样。