julia: определение типа содержит массив переменной длины

Я хотел бы определить в Юлии составной тип, который содержит массив переменной длины другого составного типа. Это лучше объяснить на примере. Допустим, у меня есть тип

type p 
    c::Int
    p() = new(0)
end

который мне не безразличен Проблема в том, когда я пытаюсь определить тип

type pp 
   len::Int
   arr::Array{p}(1, len)
end

Очевидно, я получаю сообщение об ошибке типа "len notfined" и не знаю, как это исправить. Кроме того, как я должен определить конструктор типа pp? Я новичок в Джулии, и я даже не уверен, возможно ли то, что я спрашиваю.

1 ответ

Решение

Вещи, которые идут на правой стороне :: должны быть типы. Выражение Array{p}(1, len) не тип; на самом деле он создает массив:

julia> len = 3
       Array{p}(1, len)
1×3 Array{p,2}:
 #undef  #undef  #undef

Он неинициализирован, но вы можете видеть, что это сам массив (а не тип массива). Его тип просто Array{p,2}, Итак, минимальное исправление для вашего примера просто:

type pp 
   len::Int
   arr::Array{p,2}
end

Это не совсем то, что вы хотите. Вам, вероятно, просто нужен вектор p (а не матрица строк, что к чему Array{p}(1,len) создаст). Также обратите внимание, что массивы Джулии очень полнофункциональны. Вам не нужно следить за длиной самостоятельно; массивы уже делают это.

Так что я, вероятно, напишу PP типа как это:

immutable PP
    arr::Vector{p} # Vector{p} is an alias for Array{p, 1}
end
PP(len::Int) = PP(Vector{p}(len))
Другие вопросы по тегам