Доступ к полям структуры внутри функции по строковому аргументу - PullRequest
0 голосов
/ 06 ноября 2018

Скажите, у меня есть структура,

struct MyStruct

a
b

end

Есть ли способ написать функцию, подобную следующей

function doSomething(x::MyStruct,fieldName::String)

y = x.fieldName

return f(y)

end

Я не смог найти ничего об этом в документации / форумах.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

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

0 голосов
/ 06 ноября 2018

Вы можете получить доступ к полям с помощью Symbol s, поэтому вы можете преобразовать строку в символ и затем использовать 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/.

...