Проблема здесь в том, что массив должен быть создан с правильным типом. Таким образом, основное различие двух методов:
ary = [] of T
, где T
- аргумент типа Enumerable
, который вы вызываете select, по сравнению с
ary = [] of U
, где U
является аргументом типа, специфичным для этого метода (forall U
).
Итак, чтобы сделать то, что вы хотите, нам нужно знать, что блок фильтрует элементы, но это никак не кодируется в блоках. тип. Он имеет только список типов аргументов и возвращаемый тип. Тем не менее, мы можем объединить два метода в нечто вроде:
module Enumerable(T)
def select(type : U.class) forall U
ary = [] of U
each { |e| ary << e if yield e if e.is_a? U }
ary
end
end