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