为了方便起见,我可以在 Crystal 中命名一个类型吗?

Can I name a type in Crystal for convenience?

在我的新 crystal 项目中,我有一个 class 以几种不同的方式存储其数据,这些方式对我以后很有用,都作为散列。

getter isometry_cardinality : Hash(IsometryKind, Int8)
getter axis_cardinality : Hash(Directions::Orientation, Array(IsometryKind))

我现在想根据其使用的哈希来重载我的方法:

private def has_min_cardinality?(parent_cardinality : Hash(IsometryKind, Int8))
  ...
end

private def has_min_cardinality?(parent_cardinality : Hash(Directions::Orientation, Array(IsometryKind))
  ...
end

如您所见,该声明变得很长。有什么方便的方法可以缩短它吗?例如,我可以使用 getter 作为其类型的别名吗?

private def has_min_cardinality?(parent_cardinality : isometry_cardinality)
  ...
end

private def has_min_cardinality?(parent_cardinality : axis_cardinality)
  ...
end

答案是 'no' 到 那个 具体例子,所以我的问题是:我错过了正确的方法吗?

是的,有更好的方法:alias 拯救!

您可以像本示例中那样为复杂类型设置别名并使用别名,编译器会直接替换它,因此不会影响性能。

alias IsometryCardinality = Hash(IsometryKind, Int8)
alias AxisCardinality = Hash(Directions::Orientation, Array(IsometryKind))
getter isometry_cardinality : IsometryCardinality
getter axis_cardinality : AxisCardinality
...
private def has_min_cardinality?(parent_cardinality : IsometryCardinality)
  ...
end

private def has_min_cardinality?(parent_cardinality : AxisCardinality)
  ...
end

这是一个演示:https://play.crystal-lang.org/#/r/4hoh