Object 如何获取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

给定一个复合类型的Julia对象,如何确定其字段


如果您在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)