我想知道是否可以通过使用字段名称以故意的顺序初始化用户定义的type
(或struct
)的字段,以便订单代码中定义的变量无关紧要。换句话说,我的问题是在inner
或outer
constructor
中使用关键字。
我有类似下面的代码片段,其中字段的初始化顺序与它们在代码中的出现顺序相反:
# Julia ver. 0.4.7
type MyType
x1
x2
MyType(y) = new(x2 = y, x1 = 0) # inner constructor
end
MyType(a, b) = new(x2 = a, x1 = b) # outer constructor
答案 0 :(得分:3)
您可以执行以下操作。当NamedTuples进入0.7时,这会更好。 (注意:这只是一个想法,你可能想要添加一些检查/优化)。
struct Foo
x
y
end
function Foo(;kwargs...)
kwargnames = [x[1] for x in kwargs]
Foo([kwargs[findfirst(kwargnames,i)][2] for i in fieldnames(Foo)]...)
ends
Foo(x=10,y=20) == Foo(y=20,x=10)
答案 1 :(得分:1)
作为替代答案,您还可以使用Parameters.jl
包:
using Parameters
@with_kw struct Foo
x::Int = 1
y::Float64 = 2.0
end
# now the following code works
Foo(x=3, y=4.)
Foo(y=5.)
没有性能惩罚。 Parameters.jl
包基本上在Alexander Morley的answer中解释了相同的技巧,并提供了一些额外的功能,例如字段的默认值。