2

Matlab で記述されたコードを、スタンドアロンのコンパイル済み Matlab アプリケーションに変換しようとしています。ただし、いくつかの奇妙なエラーが発生した後、同じ名前の関数が複数回使用されている (ただし結果/計算が異なる) という事実を回避するために、コードがパスへの追加と削除を多用していることに気付きました。調べてみると、名前の前に「+」を付けることでフォルダーをパッケージに変えることができ、そのパッケージ内の関数がname_of_folder.name_of_function. これで名前空間の問題は解決しますが、多くの作業が必要になる可能性があります。つまり、各関数呼び出しの先頭に正しいパッケージを追加する必要があるためです (そして、多くのファイルを複製しなければならない場合もあります)。

それから関数を見たのでimport、時間を節約できることを願っています。必要なパッケージを 1 つまたは 2 つの特定の関数に渡し、それらの関数にパッケージをインポートさせると、それらの関数が呼び出す関数がそのインポート ステートメントのスコープに収まる場合、思い通りに動作するようになると思います。たとえば、次のように設定した場合

function foo(var1, var2, ..., packagename)
  eval(sprintf('import %s.*', packagename));
  ...
  bar1(var1, var2);
  ...
  bar2(var2);
  ...

次に、インポートステートメントでインポートされたパッケージを使用することを望んbar1でいます。bar2ドキュメントには、条件と関数のインポートステートメントはそのコードブロックに限定されていると書かれていますが、「そのコードブロック」がテキストのみを意味するのか、それとも「そのコードブロック」がコードと評価されるすべてのものであるのかはわかりません結果として。前者のような気がしますが、後者であることを期待して質問させてください。

では、import ステートメントのスコープは何ですか? あるいは、この問題に対処する別の方法はありますか?

4

2 に答える 2

2

「同じ名前の複数の関数」の問題がなくなるまで、名前を変更するという苦労をするのが最善の方法です。これにより、あなたと将来のメンテナーの両方がコードを理解しやすくなります。

パッケージのアイデアとは異なる 2 つのオプション (私が気に入っています):

  1. ディレクトリ名を関数名に追加 (または先頭に追加) し、それらをすべて新しい (より適切な名前の) ディレクトリに入れることができます。状況によっては、もっと理にかなっているかもしれません。

  2. fooディレクトリbarとに定義された2 つの関数がありcar、両方の関数が同じ引数を取る場合、追加の引数としてbarまたはを取る 1 つの関数にそれらを統合できます。car

    function foo(parm1, parm2, parm3, version)
    if strcmp(version, 'bar')
        // bar code
    else
        // car code
    end
    

    これは素晴らしいことではありませんが、パスを変更するよりははるかに優れており、MATLAB のパターン (文字列引数を渡して関数の詳細な動作を変更する) に従っています。2 つのfoo関数の引数が異なっていても、これを機能させることはできますが、面倒な引数の解析を行う必要があります。

于 2012-10-25T21:38:34.003 に答える
1

私は自分で試してみるためにいくつかのテスト コードを書きました。実際、インポート ステートメントは、それを呼び出した関数のみに制限されています。記録のために、私はそれをテストするために次の短い関数を書きました:

function package_test(package_name)
  eval(sprintf('import %s.*;', package_name));

  test_function();
end

 

function test_function()
  nested_function()
end

そして入れます

function nested_function()
  disp('I\'m in the original folder :(');
end

最初の 2 つの関数と同じフォルダーにあり、

function nested_function()
  disp('I\'m in the package! :)');
end

という名前のフォルダにあります+trial。もちろん、実行するとpackage_test('trial')、ウィンドウに「元のフォルダーにいます:(」と表示され、trial.nested_function()見たい文字列が表示されました。

さらに、eval関数はコンパイラに問題を引き起こし、それを置き換えてimport(sprintf('%s.*', package_name));も役に立たないようです。そのため、ファイルの複製に戻ったようです。

于 2012-10-25T20:19:50.120 に答える