以任意顺序初始化用户定义的`types`的字段

时间:2018-01-02 11:45:50

标签: types constructor julia

我想知道是否可以通过使用字段名称以故意的顺序初始化用户定义的type(或struct)的字段,以便订单代码中定义的变量无关紧要。换句话说,我的问题是在innerouter 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

2 个答案:

答案 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中解释了相同的技巧,并提供了一些额外的功能,例如字段的默认值。