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

问题描述 投票:0回答:2

假设我有两个功能:

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)是字符串,但我希望它们指向相应的函数和变量。我想这样做,以便用户可以只更改字符串名称,然后适当地选择其他所有内容。怎么做(在朱莉娅)?

julia
2个回答
2
投票

你正在考虑评估字符串,这总是一个坏主意。相反,专注于创建适当的结构。如果你真的必须使用字符串(即使考虑到这个数组会更好),你可以将所述字符串用作字典中的键,例如:

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块来实现此目的。


2
投票

虽然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"

现在,按照你的问题,我们假设实际参数的名称在Strings中保存 - 我们需要将它们转换为Symbols:

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需要编译代码,这需要时间。

© www.soinside.com 2019 - 2024. All rights reserved.