使用字符串选择函数和/或变量(Julia)

使用字符串选择函数和/或变量(Julia),julia,Julia,假设我有两个函数: function func_one(data, pars): --- end function func_two(data, pars): --- end 每个函数都需要数据和PAR,但不一定具有相同的维度,因此我创建了 data_one = [] data_two = [] pars_one = [] pars_two = [] 接下来,我有一个字符串变量,比如name,它可以是一个或两个,用于选择稍后调用所有函数时要使用的三元组func、data、p

假设我有两个函数:

function func_one(data, pars):
    ---
end

function func_two(data, pars):
    ---
end
每个函数都需要数据和PAR,但不一定具有相同的维度,因此我创建了

data_one = []
data_two = []
pars_one = []
pars_two = []
接下来,我有一个字符串变量,比如name,它可以是一个或两个,用于选择稍后调用所有函数时要使用的三元组func、data、pars的类型。比如说

name = "one"
MainFunction(func,data,pars)
然后我有

func = "func_" * name
data = "data_" * name
pars = "pars_" * name 
那么我想称之为这样的组合,例如

name = "one"
MainFunction(func,data,pars)

实际上,我有两个以上可能的三元组func,data,par。当然,目前这不起作用,因为func、data、par都是字符串,但我希望它们指向相应的函数和变量。我想这样做,以便用户只需更改字符串名称,然后适当地选择其他所有内容。在Julia中如何做到这一点?

您的思路是计算字符串,这总是一个坏主意。相反,专注于创建适当的结构。如果您确实必须使用字符串,即使最好将其视为数组,也可以将所述字符串用作字典中的键,例如:

funcs=Dict{String,Function};>具有0个条目的Dict{String,Function} funcs[one]=数据,PAR->提供了数据和PAR的打印工作; funcs[two]=数据,PAR->print使用提供的数据和PAR执行其他操作; data=Dict{String,Any};>具有0个条目的Dict{String,Any} 数据[1]=[1 2 3 4 5]; 数据[2]=[1;2;3;4;5]; pars=Dict{String,Any};>具有0个条目的Dict{String,Any} PAR[1]=使用涡轮增压器模型; pars[two]=使用encaboturbolation语义; 使用它 funcs[one]data[one],pars[one]>使用提供的数据和par打印正在做的事情
从上面可以看出,将函数创建为“lambdas”可以很容易地将它们分配给dictionary元素。如果需要多行函数,可以使用begin。。。结束块来实现这一点。

您的思路是计算字符串,这总是一个坏主意。相反,专注于创建适当的结构。如果您确实必须使用字符串,即使最好将其视为数组,也可以将所述字符串用作字典中的键,例如:

funcs=Dict{String,Function};>具有0个条目的Dict{String,Function} funcs[one]=数据,PAR->提供了数据和PAR的打印工作; funcs[two]=数据,PAR->print使用提供的数据和PAR执行其他操作; data=Dict{String,Any};>具有0个条目的Dict{String,Any} 数据[1]=[1 2 3 4 5]; 数据[2]=[1;2;3;4;5]; pars=Dict{String,Any};>具有0个条目的Dict{String,Any} PAR[1]=使用涡轮增压器模型; pars[two]=使用encaboturbolation语义; 使用它 funcs[one]data[one],pars[one]>使用提供的数据和par打印正在做的事情
从上面可以看出,将函数创建为“lambdas”可以很容易地将它们分配给dictionary元素。如果需要多行函数,可以使用begin。。。结束块来实现这一点。

虽然Tasos是正确的,但通常您应该为此使用函数、lambda或数据结构,我理解您的问题实际上是关于元编程的。以下是如何做到这一点:

让我们从准备函数和变量开始:

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"
现在,根据您的问题,我们假设实际参数的名称保存在字符串中-我们需要将它们转换为符号:

创建代码注释插值的使用:

code = :(main_fun($f_name,$data_name,$pars_name))
现在让我们开始讨论这是一个控制台输出示例:

julia> Main.eval(code)
["hello from f1", "that is data1", "that is pars1"]

注意Main.eval需要编译代码,这需要时间

虽然Tasos正确地认为通常您应该使用函数、lambda或数据结构来实现此目的,但我理解您的问题实际上是关于元编程的。以下是如何做到这一点:

让我们从准备函数和变量开始:

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"
现在,根据您的问题,我们假设实际参数的名称保存在字符串中-我们需要将它们转换为符号:

创建代码注释插值的使用:

code = :(main_fun($f_name,$data_name,$pars_name))
现在让我们开始讨论这是一个控制台输出示例:

julia> Main.eval(code)
["hello from f1", "that is data1", "that is pars1"]
注意Main.eval需要编译代码,这需要时间