如何获得字段的价值

时间:2016-07-08 12:15:17

标签: reflection julia

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

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

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

OUTPUT:
2-element Array{Symbol,1}:
 :foo
 :bar

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

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

fieldvalue(v,fn::Symbol) = eval(Expr(:(.), v, QuoteNode(fn)))

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

USECASE:

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

您也可以使用例如getfield(baz,2)获得第二个字段而不需要知道它的名字。