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

在我的新水晶项目中,我有一个类,它以几种不同的方式存储它的数据,这些方式对我来说很有用,都是哈希 .

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',所以我的问题是:我错过了正确的方法吗?

回答(1)

2 years ago

是的,还有更好的方法: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