在由结构(Julia等效于R'with')创建的环境中评估表达式

时间:2019-01-28 17:39:58

标签: julia

在从结构的字段创建的环境中,是否有一种方法可以评估表达式?在R中,可以使用函数with完成此操作:

parameters <- list(a = 1, b = 2, c = 3)

f <- function(parameters, x) {
   with(parameters, a + b * x + c * x^2)
}

f(parameters, 7)
# [1] 162

我希望能够在Julia中做类似的事情。例如:

struct Parameters
    a::Float64
    b::Float64
    c::Float64
end

function f(p::Parameters, x)
    with(p, a + b * x + c * x^2)
end

p = Parameters(1, 2, 3)
f(p, 7)

1 个答案:

答案 0 :(得分:3)

我所知道的最好方法是使用Parameters.jl

using Parameters

struct Params
    a::Float64
    b::Float64
    c::Float64
end

function f(p::Params, x)
    @unpack a, b, c = p
    a + b * x + c * x^2
end

p = Params(1, 2, 3)
f(p, 7)

但是,由于在@unpack a, b, c = p中明确提到了字段名称,所以效果不太好。

更新

实际上,Parameters.jl还允许您解压缩所有字段,这似乎正是您想要的。但是由于潜在的类型更改/不稳定性,它被认为有些危险。有关更多详细信息,请参见here。示例:

using Parameters

@with_kw struct Params
    a::Float64
    b::Float64
    c::Float64
end

function f(p::Params, x)
    @unpack_Params p
    a + b * x + c * x^2
end

p = Params(1, 2, 3)
f(p, 7)