通过字符串参数访问函数中的结构字段

时间:2018-11-05 22:48:47

标签: julia

说我有一个结构,

regions

是否可以通过以下方式编写函数

struct MyStruct

a
b

end

我在文档/论坛中找不到关于此的任何内容。

2 个答案:

答案 0 :(得分:1)

您可以使用Symbol来访问字段,因此可以将字符串转换为符号,然后使用getproperty

julia> struct MyStruct
           a
           b
       end

julia> function doSomething(x::MyStruct, name::String)
           s = Symbol(name)
           return getproperty(x, s)
       end
doSomething (generic function with 1 method)

julia> doSomething(MyStruct(1, 2), "a")
1

但是,请注意,这可能效率很低,因为编译器很可能看不到它,因此您的代码可能是类型不稳定的,请参见https://docs.julialang.org/en/v1/manual/performance-tips/

答案 1 :(得分:1)

如果您打算仅几次获取值,redrikekre的解决方案就可以了。但是,使用元编程可以编写代码而不会降低效率,请参见下面的getDoSomething2()函数。

考虑这三个功能:

function doSomethingNative(x)
  return x.a
end

function doSomething(x, name::String)
    return getproperty(x, Symbol(name))
end

function getDoSomething2(name::String)
     field = Symbol(name)
     code = quote
         (obj) -> obj.$field
     end
     return eval(code)
end

现在设置:

using BenchmarkTools
struct MyStruct
          a
          b
end
x = MyStruct(5,6)

现在基准:

julia> @btime doSomethingNative($x)
  0.001 ns (0 allocations: 0 bytes)
5

julia> @btime doSomething($x,"a")
  36.266 ns (0 allocations: 0 bytes)
5

julia> const doSomething2 = getDoSomething2("a");

julia> @btime doSomething2($x)
  0.001 ns (0 allocations: 0 bytes)
5

如果运行@code_native doSomethingNative(x)@code_native doSomething2(x),您将看到程序集输出是相同的。