Int的数组与Int的数组的数组

时间:2017-07-27 07:55:14

标签: perl6

我想要一个多子,其中一个是Ints数组,另一个是子数组的数组。

这似乎可以解决问题:

multi sub abc(Int @array) { say 10; }

multi sub abc(Array[Int] @array) { say 20; }

但是,构建满足这些约束条件的文字非常详细:

abc Array[Int].new([1,2,3]);   # -> 10

abc Array[Array[Int]].new([Array[Int].new([1,2,3]), Array[Int].new([2,3,4])]);   # -> 20

理想情况下,我只能说:

abc [1,2,3]
abc [[1,2,3], [2,3,4]]

有没有办法构建一个abc,如上所示可以在没有所有显式类型注释的情况下进行调度?

可以设置multi sub在运行时调度吗?

1 个答案:

答案 0 :(得分:5)

您可以使用where子句执行昂贵的结构检查,而不是廉价的名义类型检查,例如

multi sub abc(@array-of-Int where .all ~~ Int) { ... }

multi sub abc(@matrix-of-Int where .all ~~ Positional & { .all ~~ Int }) { ... }

如果你选择名义类型的路线,形状数组也可能值得考虑,可以通过匿名变量更紧凑地宣布

abc my Int @[2;3] = (1,2,3), (2,3,4);
abc Array[Int].new(:shape(2,3), (1,2,3), (2,3,4));

并通过

进行检查
multi sub abc(Array[Int] $matrix where .shape == 2) { ... }