【问题标题】:Julia nested type initializationJulia 嵌套类型初始化
【发布时间】:2016-11-21 12:52:38
【问题描述】:

我使用了下面的代码,

abstract P0

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


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

并完成了以下任务。

pp=P11()

我获得了 P1 类型的 #undef,如下所示:

P11(2211879264,#undef)

如何正确初始化?

【问题讨论】:

    标签: types nested initialization julia abstract


    【解决方案1】:

    如果您想对字段值实施约束或需要不完整的初始化,您只需要内部构造函数。后者是您在此处所做的(请注意,不仅 pp.ppp.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))
    

    【讨论】:

    • 我想要不完整的初始化。 z 在我到达它时被 pp.z 初始化同时我刚刚将它们都初始化了,我将代码修改为:P11()=new(1,P1())
    • 我的意思是我想先用一些值初始化它们,因为我将使用从文件中读取的动态数组,并且我不希望初始化器与文件读取函数一起脱离类型定义。
    • 对不起,我不明白。在您的原始代码中,pp.z 只是解释恰好位于其未初始化内存位置的随机位,因为该字段是bitstypeP1 的字段也是如此。另一方面,P11().p 是一个引用,因此是#undef,直到您分配它,例如,在构造函数中或通过pp.p = P1()。此外,P11()=new(1,P1()) 禁用了默认构造函数,因此最好将其写为我的答案中的外部构造函数。
    • 感谢您的回答和信息。有没有办法使用 p 的值类型而不是像 Swift 的结构那样的引用类型?
    • 我不懂 Swift,但听起来你应该看看 immutable types。
    猜你喜欢
    • 2021-05-31
    • 2016-08-08
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多