如何获取 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),其中xDataType。例如,使用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 对象的字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Parse获取对象和数组字段?

如何从对象中获取多个字段? [复制]

Julia:如何根据具有特定值的类型字段访问类型数组中的元素

如何在mongodb的对象数组中获取指定字段的值

如何在 Julia 中逐行读取文件?

Java面试题:如何通过反射获取和设置对象私有字段的值?