では、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()は、今のままにしておくほうがいいと思います。