Crystal:如何在实例化后增加数组可以容纳的类型数

Crystal: how to increase the number of types an array can hold after instantiation

我正在构建 table 数据。首先,这个 table 的行最容易被键/值填充,所以我使用哈希

a = Hash(Int32, Symbol).new
a[1] = :one

完成后,使用数组会更方便(例如,我需要对数据进行排序)。足够简单:

a.to_a # => [{1, :one}]

但现在我发现,如果我可以在该数组中存储另一种数据类型,那么为了让我的格式化程序正常工作(多页 table,使用乳胶),事情就更有意义了,例如,一个字符串。但为时已晚!数组的类型是固定的;它不会接受字符串。

a << "str" # => ERROR!

到目前为止我想出的解决方案似乎不是很优雅:

a = Hash(Int32, Symbol).new
a[1] = :one
arr = Array(String | Tuple(Int32, Symbol)).new
a.each do |k,v|
  arr << {k,v}
end
arr << "str" # no problem now

有没有更"Crystal"/优雅的方式?

只需将 to_aas 一起使用,它可用于转换为文档所称的 "bigger" 类型

a = Hash(Int32, Symbol).new
a[1] = :one
arr = a.to_a.map { |x| x.as(String | Tuple(Int32, Symbol)) }
arr << "str" # [{1, :one}, "str"]