2014-03-04 6 views
8

I derzeit ein Typ mit einem Array-AttributDeklarieren die Größe eines Feldes Attribut in einer Typdefinition

immutable foo 
    a::Int64 
    b::Int64 
    x::Array{Float64,1} # One dimension array of Float 64, but no length info 
end 

Ich weiß, dass das Array 100 immer Float64 Elemente enthalten wird. Gibt es eine Möglichkeit, diese Informationen in der Typ-Annotation zu übergeben? Vielleicht ähnlich wie man die Größe eines instanziierten Arrays wie x = Array(Float64, 100) deklarieren kann?

+3

Feste Größe Arrays noch nicht in Julia implementiert, siehe [diese Funktion request] (https://github.com/JuliaLang/julia/issues/5857) auf GitHub. Ich dachte daran, Ihnen zu empfehlen, 'NTuple {100, Float64}' 'für Ihre Zwecke zu verwenden, aber es ist ein unveränderlicher Typ (z. B. setindex! Methode ist nicht definiert usw.). – gagolews

+2

Beachten Sie, dass [Problem] (https://github.com/JuliaLang/julia/issues/5857) eine Implementierung enthält, die funktioniert. – tholy

Antwort

3

Sie können Invarianten mit einem inneren Konstruktor erzwingen.

immutable Foo 
    a::Int64 
    b::Int64 
    x::Vector{Float64} # Vector is an alias for one-dimensional array 

    function Foo(a,b,x) 
     size(x,1) != 100 ? 
     error("vector must have exactly 100 values") : 
     new(a,b,x) 
    end 
end 

Und dann von REPL:

julia> Foo(1,2,float([1:99])) 
ERROR: vector must have exactly 100 values 
in Foo at none:7 

julia> Foo(1,2,float([1:100])) 
Foo(1,2,[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 … 91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,100.0]) 
Verwandte Themen