Int 数组与 Int 数组的多子数组
multi sub on Array of Int vs Array of Array of Int
我想要一个 multi sub,其中一个用于 Int 数组,另一个 multi sub 用于 Int 数组。
这似乎可以解决问题:
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
设置为在运行时分派?
您可以使用 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) { ... }
我想要一个 multi sub,其中一个用于 Int 数组,另一个 multi sub 用于 Int 数组。
这似乎可以解决问题:
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
设置为在运行时分派?
您可以使用 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) { ... }