23

ここで説明するように、パッケージ内の関数、およびクラス内の静的メソッドは、packagename.functionname構文または関数import packagename.*ごとに使用する必要があります(インポートは関数ワークスペースの一部であり、グローバルではないため)。これは、後でパッケージ/クラス名を変更することは退屈な迷惑になる可能性があることを意味します。

import this.*同じパッケージ/クラス内のすべての関数/静的メソッドにアクセスするためのパッケージ/クラス名にとらわれないメソッドなどのようなことを行う方法はありますか?

4

3 に答える 3

7

だから...これはimportthisもインポートする必要はありませんか?それとも、importthisはあなたがいつもあなたの道に持っている関数ですか?

各関数の先頭にこれを含む「importthis」ブロックを貼り付けるのはそれほど複雑ではないようです。そうすれば、importthisがパスにあることを心配する必要はありません。道に頼るのは危険だと感じがちです。

「これをインポート」ブロック

%% Import own package
[~, pkgdir] = fileparts(fileparts(mfilename('fullpath')));
import([pkgdir(2:end) '.*']);

それをtry/catchブロックに入れて、パッケージディレクトリにあることを確認し、そうでない場合の対処方法を決定することもできます。

%% Import own package
try
    [~, pkgdir] = fileparts(fileparts(mfilename('fullpath'))); 
    import([pkgdir(2:end)'.*']);
catch err
    if ~strcmp(err.identifier,'MATLAB:UndefinedFunction'), rethrow(err); end
end
于 2012-11-14T00:38:26.640 に答える
4

私は最近同様の問題に遭遇し、パッケージに対して次の解決策を見つけました。しかし、それは非常にハッキーです。

オプションの引数を使用して、importthisという関数を作成します。

function to_eval = importthis(exclude_list)
if nargin == 0
    exclude_list = [];
end
var_name = genvarname('A', exclude_list); %avoid shadowing
to_eval = ['[~,'...
    , var_name...
    , ']=fileparts(fileparts(mfilename(''fullpath'')));'... %get containing dir
    , 'eval([''import '','...
    , var_name...
    , '(2:end),''.*'']);'... %remove '+'
    , 'clear '... %clean up
    , var_name
    ];
end

この関数はeval、「this」パッケージをインポートする文字列を返します。したがって、パッケージ関数では、次のように上部に配置します。

function B = myfunc(A)
eval(importthis);
%function body
end

関数の名前空間をクリーンなままにwhoして、に渡すこともできます。importhis

function B = myfunc(A)
eval(importthis(who));
%function body
end

自分のやったことに誇りを持っているのか、それとも混乱しているのかを判断することはできません。

于 2012-02-01T17:54:17.307 に答える
3

これはおそらく賞金に値する答えではありませんが、あなたには答えがないので、とにかく投稿すると思いました!一度だけ定義する必要があるクラスのインスタンスを介して静的メソッドを呼び出すことができます。関数ハンドルを介して関数を呼び出すことができますが、これには関数ごとに1つのハンドルが必要になります。

これらの手法を使用すると、すべての静的メソッドと関数の参照を1か所で定義できます。次に、パッケージ全体でこれらの参照を使用します。その後、後でパッケージ名を変更することにした場合は、すべて1つの場所に保存されているこれらの参照を更新するだけで済みます。

見る:

静的メソッドの呼び出し

他のメソッドと同様に、クラスのインスタンスを使用して静的メソッドを呼び出すこともできます。

obj = MyClass;

値=obj.pi(.001);

function_handle(@)

次の例では、humps関数の関数ハンドルを作成し、それを変数fhandleに割り当てます。

fhandle = @humps;

于 2011-10-26T07:33:25.330 に答える