如何获取 Julia 对象的字段
Posted
技术标签:
【中文标题】如何获取 Julia 对象的字段【英文标题】:How to get fields of a Julia object 【发布时间】:2017-05-31 22:37:20 【问题描述】:给定一个复合类型的 Julia 对象,如何确定它的字段?
如果您在 REPL 中工作,我知道一个解决方案:首先您通过调用 typeof
确定对象的类型,然后进入帮助模式 (?
),然后查找类型。有没有更程序化的方式来实现同样的目标?
【问题讨论】:
我使用的一种技巧:在 REPL 中,对于对象x
,键入 x.
(即 x
后跟一个点 .
),然后按一次或两次 TAB。要求 Julia 自动完成命令。然后 Julia 将向您显示 x
的字段,假设它有任何字段。
【参考方案1】:
适用于 v0.7+
使用fieldnames(x)
,其中x
是DataType
。例如,使用fieldnames(Date)
,代替 fieldnames(today())
,或者使用fieldnames(typeof(today()))
。
这将返回 VectorSymbol
按顺序列出字段名称。
如果字段名称为 myfield
,则要检索该字段中的值,请使用 getfield(x, :myfield)
或快捷语法 x.myfield
。
另一个有用的相关函数是dump(x)
。
v0.7 之前
使用fieldnames(x)
,其中x
是您感兴趣的复合类型的实例,或者是DataType
。也就是说,fieldnames(today())
和 fieldnames(Date)
同等有效,并且具有相同的输出。
【讨论】:
如果我得到一个结构的第一个字段:fieldnames(s)[1]
,那将是一个符号。但是我不能使用这个表达式的结果来获取该字段的值,例如:s.fieldnames(s)[1]
尽管 s.:field 有效。 getfield
按预期工作。
s.fieldnames(s)[1]
,粗略地说,解析为:在s
中找到字面命名为fieldnames
的字段,然后像函数一样调用,以(s)
为参数,然后得到结果的第一个元素,即[1]
(这显然不是你想要做的)。如果您将实际字段名存储在某个符号a
中,则使用getfield(s, a)
。确实s.:a
也有效,但这不是惯用的 Julia,因此其他人可能很难阅读您的代码。我已经更新了我的答案,试图消除任何歧义。
以上链接失效
@liang updated link
注:如果你想要字段的类型,fieldtypes(T)
。如果你想要字段名称和它们的类型,NamedTuplefieldnames(T)(fieldtypes(T))
,对于Rational
,它会给出(num = Integer, den = Integer)
。【参考方案2】:
假设对象是obj
,
你可以通过以下代码sn-p获取其字段的所有信息:
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
返回对应的字段类型向量。
【讨论】:
以上是关于如何获取 Julia 对象的字段的主要内容,如果未能解决你的问题,请参考以下文章