0

那么,在 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()我想我宁愿让事情像现在这样。

4

1 回答 1

1

您似乎偶然发现了一些奇怪的行为(我没有使用工作“错误”,直到我确定这不是 Mathworks 的意图:)。

看起来

function import_mypackage()
    evalin('caller', 'import mypackage.*');
end

function foo()
    import_mypackage;
    g(); 
end

不起作用,但是

function import_mypackage()
    evalin('caller', 'L = import mypackage.*');
end

function foo()
    import_mypackage;
    L  
    import
end

节目

L = 
    'mypackage.*'

ans = 
    Empty cell array: 0-by-1

这意味着foo当函数import_mypackage超出范围时,调用者 ( ) 中的导入列表将被清除。

我会说这至少是不受欢迎的行为,我会说这是一个错误报告的案例。

作为一种解决方法,使用类似的东西

function L = import_mypackage()
    L = import('mypackage.*');
end

function foo()
    L = import_mypackage;        
    import(L{:});

    % do stuff with pacakge contents
    ...
end

我认为evalin无论如何都是可取的。

于 2012-11-05T13:39:26.407 回答