【发布时间】:2014-07-01 03:28:54
【问题描述】:
作为我继承的大型代码库的一部分,我具有以下功能:
function = save_function(fpath, a,b,c)
save(fpath, 'a', 'b', 'c')
end
这个函数在一个脚本结束时调用,在另一个脚本执行之前。这样,变量名就被正确保存了(糟糕的设计,我知道 - 我没有写这段代码)。
现在,我正在对代码库进行更改,并意识到我需要在 fpath 中存储更多变量。我面临两个选择:
- 编辑
save_function以接受更多输入。这会破坏代码库中也使用此函数的任何其他代码 - 写一个
save_function2(a, b, c, d, e, ...),我将在我更改的代码中调用它。这似乎也是糟糕的设计。
我最理想的做法是允许save_function 一次接收任意数量的参数,并通过传入的变量名将它们全部保存。
在谷歌搜索后,我找到了eval 和eval_in,它们将字符串评估为 matlab 代码。但是,使用这个有两个问题:
- 使用
eval非常缓慢而且非常危险 - 我并不总是事先知道我的变量的类型,所以我无法创建一个优雅、通用的
to_string函数
为了对抗灵活数量的变量,我决定使用varargin和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行失败
如何在堆栈上动态创建这些变量及其变量名?
【问题讨论】:
-
我迟到了6年,但你好像想直接打电话给
save!