Если вы планируете получить значение только несколько раз, решение 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)
, вы увидите, что выходные данные сборки идентичны.