Это вопрос новичка, и я все еще думаю «в OOP», поэтому прошу прощения, если я пропустил ответ в руководстве или если ответ очевиден.
Предположим, у нас есть абстрактный тип,
abstract type My_Abstract_type end
и несколько конкретных типов структур, которые являются потомками этого типа:
mutable struct Concrete_struct1 <: My_Abstract_type end
mutable struct Concrete_struct2 <: My_Abstract_type end
...
Предположим, у нас есть большое количество объектов конкретных типов, и нам нужно store и l oop через эти объекты. В Python мы могли бы просто составить список объектов, а l oop - через список. Точно так же в C ++ мы могли бы создать массив указателей (типа My_Abstract_type) и l oop через него, полиморфно вызывая все необходимое.
Однако я не могу понять, как это сделать чисто в Юлии. Мы можем создать массив my_array::Array{My_Abstract_type,1}
, а затем l oop через него:
for my_object in my_array
do_something!(my_object)
end
, но, как здесь обсуждается https://docs.julialang.org/en/v1/manual/performance-tips/#man -performance-abstract-container-1 , это приводит к значительному снижению производительности (в моем случае это примерно в 25 раз медленнее).
Одна альтернатива - сделать что-то вроде:
my_array1::Array{Concrete_struct1,1}
my_array2::Array{Concrete_struct2,1}
my_array3::Array{Concrete_struct3,1}
...
, а затем
for my_object in my_array1
do_something!(my_object)
end
for my_object in my_array2
do_something!(my_object)
end
for my_object in my_array3
do_something!(my_object)
end
Это дает нам желаемую производительность, но, очевидно, является ужасной практикой программной инженерии, особенно в случаях с большим количеством конкретных типов. Как мы можем хранить и l oop поверх этих объектов в Julia чисто и без ущерба для производительности ? Спасибо!