朱莉娅的结构文字

时间:2017-06-28 21:48:14

标签: struct julia

我正在开展一个项目,在这个项目中,能够初始化匿名结构(也就是不关心它们是什么类型)非常有用,它们具有任意数量的字段和类型为Any的值,一条线。

基本上我需要一个Dict,但是可以使用点表示法访问值(我意识到我可以在这里使用Dict,但我不是最终用户)。

我有没有办法在朱莉娅这样做,或者我可以定义一些具有疯狂的getfield()重载的神奇类型(显然现在称为可变结构)?我在Github上看到了关于超载的PR。这也很酷,但我看到很可能不会很快到来。

谢谢!

2 个答案:

答案 0 :(得分:3)

如果你对你的'anonymous struct'是不可变的感到满意(我假设你使用'literals'这个词就是这种情况),那么你可以用一个闭包来模拟它,这个闭包可以很简单地通过let关键字:

julia> D = let a=1, b=2; () -> Any[a,b]; end
(::#1) (generic function with 1 method)

julia> fieldnames(D)
2-element Array{Symbol,1}:
 :b
 :a

julia> D()
2-element Array{Any,1}:
 1
 2

julia> D.a
1

julia> D.b
2

julia> (let a=1, b=2; () -> Any[a,b]; end).a
1

julia> (let a=1, b=2; () -> Any[a,b]; end).b
2

这是因为closures capture their 'closed' variables as fields

<子> PS。更具体地说,闭包是作为可调用的类型在引擎盖下实现的(或者我被告知:p)

<子> PPS。由于某种原因,闭包中的字段以相反的顺序引入。如果订单对您很重要(fieldnames(D)D()中的元素的顺序相同),请在let声明中以相反的顺序引入“字段”,例如:{{1} }。

<子> PPPS。或者,如果你发现这个语法很难看,你总是可以实现一个“createAnonymousStruct”函数,它接受一个Dictionary或者其他东西并返回这样一个闭包

答案 1 :(得分:2)

尝试使用NamedTuples包:https://github.com/blackrock/NamedTuples.jl 我们还在努力将其添加到语言中,因此它可以具有更好的语法,因此我们可以确保它在每种情况下都能正常工作。