Точная схема будет зависеть от того, чего вы хотите достичь, но вот один пример:
struct Data{V, A <: AbstractArray{V}, T}
mat::A
point::T
Data(mat::A, point::T = nothing) where {V, A <: AbstractArray{V}, T} =
new{V,A,T}(mat,point)
end
Использование
julia> d0 = Data([1,2,3])
Data{Int64,Array{Int64,1},Nothing}([1, 2, 3], nothing)
julia> d1 = Data([1.0,2.0],d0)
Data{Float64,Array{Float64,1},Data{Int64,Array{Int64,1},Nothing}}([1.0, 2.0], Data{Int64,Array{Int64,1},Nothing}([1, 2, 3], nothing))
Советы:
-
Никогда не используйте нетипизированные контейнеры. Следовательно, когда вы хотите сохранить Array
, вам нужно иметь его тип в вашем определении struct
.
Использовать имена, начинающиеся с заглавной буквы, для struct
s
Предоставьте конструкторам, чтобы ваш API читался
Последнее, но не менее важное. Если вы хотите иметь несколько уровней вложенности для такой структуры, время компиляции значительно возрастет. В этом случае обычно лучше использовать однородные типы. В таком сценарии ios вы могли бы использовать вместо этого, возможно, тип Union
s (объединения Юлия небольшого числа типов быстрые в Юлии).