我正在做一个项目,在这个项目中,能够初始化匿名结构(也就是不关心它们是什么类型)非常有用,这些结构具有任意数量的字段和 Any 类型的值,全部合而为一线。
本质上,我需要一个字典,但可以使用点符号访问值(我意识到我可以在这里使用一个字典,但我不是这里的最终用户)。
有没有一种方法可以在 Julia 中按原样执行此操作,或者我可以定义一些具有疯狂 getfield() 重载的神奇类型(显然现在称为可变结构)?我在 Github 上看到了关于重载的 PR。这也很酷,但我发现它可能不会很快推出。
谢谢!
最佳答案
如果您对不可变的“匿名结构”感到满意(我假设是这种情况,因为您使用了“文字”一词),那么您可以使用闭包来模拟它,闭包可以通过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 .
<子>附言。更具体地说,闭包在幕后作为可调用类型实现(或者有人告诉我:p)
PPS。由于某种原因,闭包中的字段以相反的顺序引入。如果顺序对您很重要(例如 fieldnames(D)
和 D()
中的元素顺序相同),请在 中以相反的顺序引入“字段” >let
声明,例如:D = let c=3, b=2, a=1; () -> 任何[a,b,c];结束
。
PPPS。或者,如果您发现这种语法很丑陋,您总是可以实现一个“createAnonymousStruct”函数,它接受一个字典或其他东西并返回这样一个闭包
关于Julia 中的结构文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44813090/