如何声明接受类型化数组参数的函数
How to declare a function that accepts a typed array parameter
假设我要声明一个函数,其参数是一个字符串数组:
sub process-string-array(Str[] stringArray) # invalid
{
...
}
我该怎么做?
这取决于您要使用的印记:
sub process-string-array(Str @array) { ... } # @-sigil
sub process-string-array(Array[Str] $array) { ... } # $-sigil
请注意,您必须小心传递声明的 Str 数组才能执行此操作,这意味着需要使用类型化声明传递临时数组:
my Str @typed-array = <a b c>;
process-string-array <a b c>; # errors
process-string-array @typed-array; # typed array in
process-string-array Array[Str].new: <a b c>; # adhoc typed array
如果您不想像这样处理类型数组,您可以使用 where
子句来接受任何 Any
类型的数组,而这些数组恰好只包含 Str
元素(使用 IME 通常更容易):
sub process-string-array(@array where .all ~~ Str) { ... }
然而,这(正如 jnthn 在评论中提醒的那样)需要对每个元素进行类型检查(因此 O(n) perf 与 O(1) ),因此根据对性能敏感的程度,这可能是值得的额外的代码噪声。根据 Brad 的建议,您可以 multi
它,以便在键入数组时加快处理速度,而在未键入数组时回退到较慢的方法。
multi sub process-string-array(Int @array) {
... # actual processing here
}
multi sub process-string-array(@array where .all ~~ Str) {
process-string-array Array[Int].new: @array
}
假设我要声明一个函数,其参数是一个字符串数组:
sub process-string-array(Str[] stringArray) # invalid
{
...
}
我该怎么做?
这取决于您要使用的印记:
sub process-string-array(Str @array) { ... } # @-sigil
sub process-string-array(Array[Str] $array) { ... } # $-sigil
请注意,您必须小心传递声明的 Str 数组才能执行此操作,这意味着需要使用类型化声明传递临时数组:
my Str @typed-array = <a b c>;
process-string-array <a b c>; # errors
process-string-array @typed-array; # typed array in
process-string-array Array[Str].new: <a b c>; # adhoc typed array
如果您不想像这样处理类型数组,您可以使用 where
子句来接受任何 Any
类型的数组,而这些数组恰好只包含 Str
元素(使用 IME 通常更容易):
sub process-string-array(@array where .all ~~ Str) { ... }
然而,这(正如 jnthn 在评论中提醒的那样)需要对每个元素进行类型检查(因此 O(n) perf 与 O(1) ),因此根据对性能敏感的程度,这可能是值得的额外的代码噪声。根据 Brad 的建议,您可以 multi
它,以便在键入数组时加快处理速度,而在未键入数组时回退到较慢的方法。
multi sub process-string-array(Int @array) {
... # actual processing here
}
multi sub process-string-array(@array where .all ~~ Str) {
process-string-array Array[Int].new: @array
}