В следующем примере, я полагаю, мне приходится иметь дело с типом Enumerable некоторых структур данных, заполненных литералами:
module TestGenerics
class Foo(T)
include Enumerable(T)
def initialize(@data : T)
typeof(@data)
typeof(@data.first)
end
end
Foo.new(1..3)
Foo.new([1, 'A', 3.14])
Foo.new([[1, 'A', 3.14], [2, 'Z', 9.99]])
Foo.new({"A" => [1, 'A', 3.14], "B" => [2, 'Z', 9.99]})
end
Для каждого экземпляра класса Foo typeof (@data) дает:
Диапазон (Int32, Int32)
Массив (Char | Float64 | Int32)
Array (Array (Char | Float64 | Int32))
Hash (String, Array (Char | Float64 | Int32))
иtypeof (@ data.first) дает:
- Int32
- (Char | Float64 | Int32)
- Array (Char | Float64 | Int32)
- Tuple (String, Array (Char | Float64 | Int32))
Это хорошо, но теперь моя проблема: как я могу использовать любой из этих предполагаемых типов с помощью Crystal Compiler в другой частимоего кода?Или это вообще невозможно?!
Спасибо
[РЕДАКТИРОВАТЬ] Мой вопрос возник из моего проекта по адаптации личного приложения, написанного на Ruby, к языку Crystal (который я открываю).Это приложение использует Ruby Gem Tabulo (https://github.com/matt-harvey/tabulo),, поэтому я пытаюсь также адаптировать этот Gem к языку Crystal.
Этот Ruby Gem предназначен для форматирования таблиц данных (фактически, любого типа перечислимогоструктура данных), определяя столбцы для отображения. Это делается с помощью функции «add_column», которая имеет среди своих параметров различные атрибуты форматирования и, что более важно, блок для доступа к базовым данным на уровне «строки» (чей тип задан typeof (@ data.first) в примере кода). Я сделал адаптацию, взяв определенный тип данных: Array (Array (Float64)). Он работает, и теперь моя цель - сделать эту адаптациюуниверсальный, вероятно, потребует любого ввода Enumerable данных, как показано в приведенном выше примере кода.
Итак, насколько мои (плохие) навыки позволяют мне понять, как работает Crystal в этом случае, мне нужноиспользуйте тип данных, определенный входной структурой данных.
Извините, если в этом объяснении не хватает деталей, но логика Tabulo Gem не подходитСложно, и довольно сложно обобщить в нескольких словах.В любом случае, спасибо за вашу помощь.