我正在尝试使用不同数量的参数对不同的函数运行循环。变量是在运行时在循环内创建的,我想在每次迭代时使用 eval 来使用变量 :symbol 实例化一个 Struct。但是,我不能这样做,因为 eval 只在全局范围内有效。这是有效案例的 MWE:
function f1(x); return x; end
function f2(x1,x2); return x1+x2; end
handles = [f1,f2]
args =[:(x1),:(x1,x2)]
x1 = 1; x2 = 1;
for (i,f) in enumerate(handles)
params = eval(args[i])
@show f(params...)
end
f(params...) = 1
f(params...) = 2
但是,如果我在循环内移动变量定义(这正是我真正想要的),则在重新启动 Julia 来清除工作区后它不起作用。
function f1(x); return x; end
function f2(x1,x2); return x1+x2; end
handles = [f1,f2]
args =[:(x1),:(x1,x2)]
for (i,f) in enumerate(handles)
x1 = 1; x2 = 1;
params = eval(args[i])
@show f(params...)
end
ERROR: UndefVarError: x1 not defined
我尝试过几个答案,例如this one https://stackoverflow.com/questions/21267962/how-can-i-eval-a-local-variable-in-julia,但我似乎无法让它发挥作用。我可以编写一个自定义调度函数,它接受 [x1,x2] 并使用正确的参数调用 f1 或 f2。但是,有没有办法通过 eval 或其他优雅的解决方案来做到这一点?
编辑:这里有更多关于我在代码中尝试执行的操作的详细信息。我有每个算法的配置结构,在这个结构中我想预先定义它需要的参数
KMF_config = AlgConfig(
name = "KMF",
constructor = KMC.KMF,
parameters = :(mu,N,L,p),
fit = KMC.fit!)
MF_config = AlgConfig(
name = "MF",
constructor = KMC.MF,
parameters = :(mu,N,L),
fit = KMC.fit!)
alg_config_list = [KMF_config, MF_config]
for (i,alg_config) in enumerate(alg_config_list)
mu,N,L,p,A,B,C,D,data = gen_vars() #this returns a bunch of variables that are used in different algorithms
method = alg_config.constructor(eval(method.parameters)...)
method.fit(data)
end
一种可能的解决方案是让一个函数获取所有变量和方法,并根据 method.name 返回一个包含变量子集的元组。但我不确定这是否是最好的方法。