如何获得字段的价值

Lyn*_*ite 4 reflection julia

在朱莉亚,我可以得到一个像这样的字段列表

INPUT:
type Foobar
    foo::Int
    bar::String
end

baz = Foobar(5,"GoodDay")
fieldnames(baz)

OUTPUT:
2-element Array{Symbol,1}:
 :foo
 :bar
Run Code Online (Sandbox Code Playgroud)

但是,考虑到我动态找到的名称,如何访问这些字段的值?

我知道一种方法是自己构建表达式:

fieldvalue(v,fn::Symbol) = eval(Expr(:(.), v, QuoteNode(fn)))
Run Code Online (Sandbox Code Playgroud)

这有点可怕,所以我认为有更好的方法.

用例:

INPUT:
function print_structure(v)
    for fn in fieldnames(v)
        println(fn,"\t", fieldvalue(v,fn))
    end   
end
print_structure(baz)

OUTPUT:
foo 5
bar GoodDay
Run Code Online (Sandbox Code Playgroud)

Dan*_*etz 5

getfield(baz, :foo)foo将从变量获取字段,baz即结果将与相同baz.foo.

注意:foo必须是一个符号,因此如果您以某种方式获取字符串中的字段名称,它应该如下使用:getfield(varname, Symbol(fieldnamestring))