2016-11-21 99 views
0

我用下面的代码,朱莉娅嵌套类型初始化

abstract P0 

type P1 <: P0 
    x::Float64 
    y::Int64 
    P1()=new() 
end 


type P11 <: P0 
    z::Int64 
    p::P1 
    P11()=new() 
end 

,并做了如下分配。

P11(2211879264,#undef) 

我怎样才能正确初始化:

pp=P11() 

我的类型P1为以下获得和#undef

回答

2

如果您想对字段值施加约束或需要不完整的初始化,则只需要内部构造函数。后者是你在这里做的(注意,不仅pp.p而且pp.z未初始化)。

否则,优选使用外部构造函数,例如,用于设置字段的默认值。例如:

abstract P0 

type P1 <: P0 
    x::Float64 
    y::Int64 
end 

P1() = P1(0.0, 0) 

type P11 <: P0 
    z::Int64 
    p::P1 
end 

P11() = P11(0, P1()) 

P11() # returns P11(0,P1(0.0,0)) 
+0

我希望不完整的初始化。 z初始化,因为我达到了它pp.z 同时我刚刚初始化他们我修改代码为: P11()= new(1,P1()) –

+0

我的意思是我想初始化它们的一些值先因为我将使用从文件读取的动态数组,并且我不希望将初始化器与文件读取功能一起从类型定义中移出。 –

+0

对不起,我不明白。在你原来的代码中,'p​​p.z'只是解释恰好位于未初始化的内存位置的随机位,因为该字段是'bitstype'。 “P1”的字段也是如此。另一方面,'P11()。p'是一个引用,因此它是'#undef'直到你赋值,例如在构造函数中,或者由'pp.p = P1()'。此外,'P11()= new(1,P1())'会禁用默认的构造函数,因此可以更好地将其写成外部构造函数。 – tim