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))