2014-02-24 54 views
1

如何在Julia中使用少于输入值的输入构建构造函数?我有一个Int64数组数组,其中每个数字代表24个布尔值。最好的情况是我可以发送数组并获取每个组件的数组的复合类型。这是我试过的代码。在Julia中构建非默认构造函数

type Status 
    Valve1::Array{Bool} 
    Valve2::Array{Bool} 
    Valve3::Array{Bool} 
    Valve4::Array{Bool} 
    Valve5::Array{Bool} 
    Valve6::Array{Bool} 
    Valve7::Array{Bool} 
    Valve8::Array{Bool} 

    # Constructor for Status type 
    function Status(vals::Array{Int64}) 
    l = int64(length(vals)) 

    Valve1 = Array(Bool,l) 
    Valve2 = Array(Bool,l) 
    Valve3 = Array(Bool,l) 
    Valve4 = Array(Bool,l) 
    Valve5 = Array(Bool,l) 
    Valve6 = Array(Bool,l) 
    Valve7 = Array(Bool,l) 
    Valve8 = Array(Bool,l) 

    # Parse Inputs 
    for i=1:l 
     # Byte 1 
     Valve1[i] = vals[i] & 2^(1-1) > 0 
     Valve2[i] = vals[i] & 2^(2-1) > 0 
     Valve3[i] = vals[i] & 2^(3-1) > 0 
     Valve4[i] = vals[i] & 2^(4-1) > 0 
     Valve5[i] = vals[i] & 2^(5-1) > 0 
     Valve6[i] = vals[i] & 2^(6-1) > 0 
     Valve7[i] = vals[i] & 2^(7-1) > 0 
     Valve8[i] = vals[i] & 2^(8-1) > 0 
    end # End of conversion 

    new(Valve1,Valve2,Valve3,Valve4,Valve5,Valve6,Valve7,Valve8) 

    end # End of constructor 
end # End of type 

这会导致no method convert(Type{Bool},Array{Bool,1})错误。我试图用statuses = Status(StatusW)实例化它,其中StatusW是一个Int64数组值。

有用的参考资料:TypesJulia documentation

+0

将定义更改为'Valve1 :: Array {Bool,1}'会导致类似的错误。 'no method convert(Type {Array {Bool,1}},Bool)' – Jeremy

回答

1

声明需要如下。

Valve1::Vector{Bool} 

有助于我的困惑的另一个因素是new(Valve1,...)应该是在构造函数中的最后一件事。我在new(Valve1,...)之后添加了调试println()行,导致类型返回Nothing

Tim Holy在Julia Google Groups论坛提供了solution

完整的例子应该是这样的。

type Status 
    Valve1::VectorBool} 
    Valve2::Vector{Bool} 
    Valve3::Vector{Bool} 
    Valve4::Vector{Bool} 
    Valve5::Vector{Bool} 
    Valve6::Vector{Bool} 
    Valve7::Vector{Bool} 
    Valve8::Vector{Bool} 

    # Constructor for Status type 
    function Status(vals::Array{Int64}) 
     l = int64(length(vals)) 

     Valve1 = Array(Bool,l) 
     Valve2 = Array(Bool,l) 
     Valve3 = Array(Bool,l) 
     Valve4 = Array(Bool,l) 
     Valve5 = Array(Bool,l) 
     Valve6 = Array(Bool,l) 
     Valve7 = Array(Bool,l) 
     Valve8 = Array(Bool,l) 

     # Parse Inputs 
     for i=1:l 
      # Byte 1 
      Valve1[i] = vals[i] & 2^(1-1) > 0 
      Valve2[i] = vals[i] & 2^(2-1) > 0 
      Valve3[i] = vals[i] & 2^(3-1) > 0 
      Valve4[i] = vals[i] & 2^(4-1) > 0 
      Valve5[i] = vals[i] & 2^(5-1) > 0 
      Valve6[i] = vals[i] & 2^(6-1) > 0 
      Valve7[i] = vals[i] & 2^(7-1) > 0 
      Valve8[i] = vals[i] & 2^(8-1) > 0 
     end # End of conversion 

     new(Valve1,Valve2,Valve3,Valve4,Valve5,Valve6,Valve7,Valve8) 

    end # End of constructor 
end # End of type 
0

错误消息的Constructors部分是正确的,但不幸的是挺难理解朱莉娅的一般错误消息。

问题是,您声明您的字段为部分初始化的Array{Bool, N},并且当您尝试使用Array{Bool, 1}调用构造函数时似乎不起作用。

正确的解决方案是声明类型包含完全初始化类型Array{Bool,1}或使用别名Vector{Bool}

你使用的是哪个版本的Julia?您发布的代码适用于最新的朱莉娅大师,我认为这可能在https://github.com/JuliaLang/julia/issues/4026解决了。

+0

Version 0.2.0(2013-11-16 23:44 UTC) – Jeremy