Julia 如何在不使用eval的情况下从符号中获取函数?

Julia 如何在不使用eval的情况下从符号中获取函数?,julia,Julia,我有一个符号,表示要调用的函数的名称: julia> func_sym = :tanh 我可以使用该符号获取tanh函数,并使用以下方法调用它: julia> eval(func_sym)(2) 0.9640275800758169 但是我宁愿避免在那里使用“eval”,因为它会被多次调用,而且代价很高(func_sym可以根据上下文有几个不同的值) 在Ruby中,你可以说: obj.send(func_sym, args) 朱莉娅身上有类似的东西吗 编辑:有关我为什么使用符号

我有一个符号,表示要调用的函数的名称:

julia> func_sym = :tanh
我可以使用该符号获取tanh函数,并使用以下方法调用它:

julia> eval(func_sym)(2)
0.9640275800758169
但是我宁愿避免在那里使用“eval”,因为它会被多次调用,而且代价很高(func_sym可以根据上下文有几个不同的值)

在Ruby中,你可以说:

obj.send(func_sym, args)
朱莉娅身上有类似的东西吗

编辑:有关我为什么使用符号表示函数的更多详细信息:

我有一个类型(来自神经网络)包含激活函数,最初我将其作为函数包含:

type NeuralLayer
  weights::Matrix{Float32}
  biases::Vector{Float32}
  a_func::Function
end
但是,我需要使用JLD将这些东西序列化到文件中,但无法序列化函数,因此我使用了一个符号:

type NeuralLayer
  weights::Matrix{Float32}
  biases::Vector{Float32}
  a_func::Symbol
end
目前我使用上面的eval方法调用激活函数。有许多神经催乳素,每一种都有自己的激活功能

但是我宁愿避免在那里使用“eval”,因为它会被多次调用,而且代价很高(func_sym可以根据上下文有几个不同的值)


这种动态调度在Julia中是可能的,但不推荐使用。基于上下文更改“func_sym”的值会破坏类型推断以及方法专门化和内联。相反,推荐的方法是使用,详见手册章节。

@Isaiah的答案是正确的;在对原始问题进行编辑之后,可能更是如此。要详细说明并使其更具体地针对您的案例:我将您的
neuralayer
类型更改为参数化:

type NeuralLayer{func_type}
  weights::Matrix{Float32}
  biases::Vector{Float32}
end
由于
func\u type
不会出现在字段的类型中,因此构造函数将要求您显式指定它:
layer=neuralayer{:excitative}(w,b)
。这里的一个限制是不能修改类型参数

现在,
func_type
可以是一个符号(就像您现在所做的那样),也可以是一个功能更相关的参数(或多个参数),用于调整激活函数。然后定义如下激活函数:

# If you define your NeuralLayer with just one parameter:
activation(layer::NeuralLayer{:inhibitory}) = …
activation(layer::NeuralLayer{:excitatory}) = …
# Or if you want to use several physiological parameters instead:
activation{g_K,g_Na,g_l}(layer::NeuralLayer{g_K,g_Na,g_l} = f(g_K, g_Na, g_l)

关键的一点是函数和行为是数据外部的。使用类型定义和抽象类型层次结构来定义行为,就像在外部函数中编码的那样……但只在类型中存储数据本身。这与Python或其他强面向对象的范例截然不同,需要一些人来适应。

Matt B。这看起来是一个很好的方法。但是,我如何定义一个复制函数,它可以将neuralayer{:tanh}复制到neuralayer{:relu}上呢?(为NeuralLayer的通用副本?)哦,明白了:copy{FromT}(ol::NeuralLayer{FromT},to_type::Symbol=FromT)=NeuralLayer{to_type}(Base.copy(ol.weights),Base.copy(ol.bias))