假设我有两个功能:
function func_one(data, pars):
---
end
function func_two(data, pars):
---
end
每个函数都需要数据和分析,但不一定需要相同的维度,所以我创建了
data_one = []
data_two = []
pars_one = []
pars_two = []
接下来,我有一个字符串变量,比如名称,可以是“一个”或“两个”,并且用于选择在我调用所有内容后将使用的三元组(func,data,pars)的类型。例如
name = "one"
然后我有
func = "func_" * name
data = "data_" * name
pars = "pars_" * name
然后我想称这种组合为例
MainFunction(func,data,pars)
实际上,我有两个以上可能的三元组(func,data,pars)。当然,此时这不起作用,因为(func,data,pars)是字符串,但我希望它们指向相应的函数和变量。我想这样做,以便用户可以只更改字符串名称,然后适当地选择其他所有内容。怎么做(在朱莉娅)?
你正在考虑评估字符串,这总是一个坏主意。相反,专注于创建适当的结构。如果你真的必须使用字符串(即使考虑到这个数组会更好),你可以将所述字符串用作字典中的键,例如:
funcs = Dict{String, Function}(); #> Dict{String,Function} with 0 entries
funcs["one"] = (data, pars) -> print("Doing stuff with provided data and pars");
funcs["two"] = (data, pars) -> print("Doing something else with provided data and pars");
data = Dict{String, Any}(); #> Dict{String,Any} with 0 entries
data["one"] = [1 2 3 4 5];
data["two"] = [1;2;3;4;5];
pars = Dict{String, Any}(); #> Dict{String,Any} with 0 entries
pars["one"] = "Use turbo encabulator model";
pars["two"] = "Use encaboturbolation semantics";
# Use it
funcs["one"](data["one"], pars["one"]) #> prints "Doing stuff with provided data and pars"
从上面可以看出,将函数创建为“lambdas”可以很容易地将它们分配给字典元素。如果您需要多行函数,可以使用begin ... end
块来实现此目的。
虽然Tasos是正确的,但通常你应该使用函数,lambdas或数据结构来实现这个目的,我理解你的问题实际上是关于元编程。这是怎么做的:
让我们从准备函数和变量开始:
function main_fun(f,data,pars)
println([f(),data,pars])
end
function f1()
return "hello from f1"
end
data1 = "I'm data1"
pars1 = "I'm pars1"
现在,按照你的问题,我们假设实际参数的名称在String
s中保存 - 我们需要将它们转换为Symbol
s:
f_name, data_name, pars_name = Symbol.(("f1","data1","pars1"))
创建代码(注意使用插值):
code = :(main_fun($f_name,$data_name,$pars_name))
现在让我们开始讨论(这是一个示例控制台输出):
julia> Main.eval(code)
["hello from f1", "that is data1", "that is pars1"]
请注意,Main.eval
需要编译代码,这需要时间。