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式は常に現在の worspace で評価されるということだと思います。見る:

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 が意図したものではないことを確認するまで、workd の「バグ」は使用しません :)。

のようだ

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 に答える