継承した大規模なコードベースの一部として、次の関数があります。
function = save_function(fpath, a,b,c)
save(fpath, 'a', 'b', 'c')
end
この関数は、1 つのスクリプトの最後で、別のスクリプトが実行される前に呼び出されます。このようにして、変数名が適切に保存されます (悪い設計です。私は知っています - 私はこのコードを書きませんでした)。
現在、コードベースに変更を加えており、より多くの変数を に格納する必要があることに気付きましたfpath
。私は2つの選択肢に直面しています:
save_function
より多くの入力を受け入れるように編集します。これにより、この関数も使用するコードベース内の他のコードが壊れます。save_function2(a, b, c, d, e, ...)
変更するコードで呼び出すaを記述します。これも悪いデザインのようです。
私が理想的にやりたいことはsave_function
、一度に任意の数の引数を取り、渡された変数名でそれらをすべて保存できるようにすることです。
グーグルで検索したところ、文字列を matlab コードとして評価するeval
とが見つかりました。eval_in
ただし、これを使用するには次の 2 つの問題があります。
- 使用
eval
は恐ろしく遅く、非常に危険です to_string
変数の型を事前に知っているとは限らないため、洗練された汎用関数を作成できません
可変数の変数に対抗するために、次のようにvarargin
andを使用することにしました。inputname
function = save_function(fpath, varargin)
names = {}
for i=1:size(varargin,1)
names{i} = inputname(i+1); % have to offset by 1 to account for fpath
end
save(fpath, names{:});
end
残念ながら、入力変数は に保持されてvarargin
いるため、スタック上に変数名として存在しないため、このsave
行は失敗します。
これらの変数を変数名でスタック上に動的に作成するにはどうすればよいですか?