如何声明接受类型化数组参数的函数

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
}