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

zen*_*nix 10 raku

假设我想声明一个函数,其参数是一个字符串数组:

sub process-string-array(Str[] stringArray) # invalid
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

use*_*601 11

这取决于您要使用的印记:

sub process-string-array(Str        @array) { ... }  # @-sigil
sub process-string-array(Array[Str] $array) { ... }  # $-sigil
Run Code Online (Sandbox Code Playgroud)

请注意,您必须小心传入已声明的 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
Run Code Online (Sandbox Code Playgroud)

如果你不想处理这样的输入数组,你可以使用一个where子句来接受任何Any只包含Str元素的-typed 数组(这通常更容易使用 IME):

sub process-string-array(@array where .all ~~ Str) { ... }
Run Code Online (Sandbox Code Playgroud)

然而,这(正如 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
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,检查类型化数组的数组大小为“O(1)”,但“where”方法为“O(n)”——也就是说,您确实不想在任何性能问题的地方执行此操作。 (4认同)
  • 您可以使用多低音炮。`多进程字符串数组(@array where .all ~~ Str) { samewith( Array[Str].new: @array )}` `多进程字符串数组(Str @array) { ... }` (3认同)