Object 如何获取Julia对象的字段
给定一个复合类型的Julia对象,如何确定其字段Object 如何获取Julia对象的字段,object,types,field,julia,Object,Types,Field,Julia,给定一个复合类型的Julia对象,如何确定其字段 如果您在REPL中工作,我知道一种解决方案:首先通过调用typeof,确定对象的类型,然后进入帮助模式(?),然后查找类型。是否有更具编程性的方法来实现同样的目标?对于v0.7+ 使用fieldnames(x),其中x是数据类型。例如,使用fieldnames(Date),而不是fieldnames(today()),或者使用fieldnames(typeof(today()) 这将返回Vector{Symbol}按顺序列出字段名 如果字段名为m
如果您在REPL中工作,我知道一种解决方案:首先通过调用
typeof
,确定对象的类型,然后进入帮助模式(?
),然后查找类型。是否有更具编程性的方法来实现同样的目标?对于v0.7+
使用fieldnames(x)
,其中x
是数据类型。例如,使用fieldnames(Date)
,而不是fieldnames(today())
,或者使用fieldnames(typeof(today())
这将返回Vector{Symbol}
按顺序列出字段名
如果字段名为myfield
,则要检索该字段中的值,请使用getfield(x,:myfield)
,或使用快捷语法x.myfield
另一个有用的相关功能是dump(x)
在v0.7之前
使用fieldnames(x)
,其中x
是您感兴趣的复合类型的实例,或者是数据类型。也就是说,fieldnames(today())
和fieldnames(Date)
同样有效,并且具有相同的输出。假设对象是obj
您可以使用以下代码段获取其字段的所有信息:
T = typeof(obj)
for (name, typ) in zip(fieldnames(T), T.types)
println("type of the fieldname $name is $typ")
end
这里,fieldnames(T)
返回字段名的向量,而T.types
返回字段类型的对应向量。我使用的一个技巧:在REPL处,对于对象x
,键入x.
(即x
,后跟一个点
),然后点击TAB一两次。这要求Julia自动完成命令。Julia将向您显示x
的字段,假设它有任何字段。如果我得到结构的第一个字段:字段名[1]
,这将是一个符号。但我无法使用此表达式的结果来获取该字段的值,例如:s.fieldnames[1]
尽管s.:field有效getfield
按预期工作。s.fieldnames[1]
粗略地说,解析为:在s
中找到按字面命名的fieldnames
字段,然后调用它,就好像它是一个以(s)
为参数的函数一样,然后获取结果的第一个元素,即[1]
(这显然不是您想要做的)。如果实际字段名存储在某个符号a
中,则使用getfield(s,a)
。s:a
确实也有效,但这不是惯用的Julia,因此其他人可能很难阅读您的代码。我已更新了我的答案,试图消除任何歧义。上面的链接是broken@liang注意:如果您需要字段的类型,fieldtypes(T)
。如果您同时需要字段名及其类型,NamedTuple{fieldnames(T)}(fieldtypes(T))
,这对于Rational
将给出(num=Integer,den=Integer)
。