说我有一个结构,
regions
是否可以通过以下方式编写函数
struct MyStruct
a
b
end
我在文档/论坛中找不到关于此的任何内容。
答案 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)
,您将看到程序集输出是相同的。