Perl6 - 在某些子例程签名中 $: 是什么

Perl6 - What is the $: for in some subroutine Signatures

我在 another question 中看到了这条错误消息,我想知道签名中 $: 部分的含义是什么?

Cannot resolve caller index(Str: Str, Any); none of these signatures match:
      (Str:D $: Cool:D $needle, *%_)
      (Str:D $: Str:D $needle, *%_)
      (Str:D $: Cool:D $needle, Cool:D $pos, *%_)
      (Str:D $: Str:D $needle, Int:D $pos, *%_)

: 将第一个参数标记为 invocant

my $word = "bananarama";
say $word.index( "r", 0 );

在这种情况下,它表示调用者将被视为标量,因为它受到单个 $

的约束

$: 是两个截然不同的不相关标记,一个 $ 和一个 :,它们被混合在一起。


$ 表示单个项目1 又名标量2.

单个项目/标量尚未命名,因此无法引用它。并且已经有足够的参数(Str:D)让您和编译器知道这个参数是一个标量(单个字符串)。无论哪种方式,$ 都是多余的,.


:是一个特殊的参数分隔符。 (通常的参数分隔符是逗号,。)

它只能在方法或独立签名的第一个参数之后立即使用。它不能用于不是方法的例程的签名中。

如果用作签名中第一个参数之后的参数分隔符,它会将该参数标记为对应于方法的 "invocant"

(如果不使用,invocant参数是隐含的。)

相应的调用者 参数 无论如何都会到达,并别名为 self,无论签名是否明确列出调用者参数。但是如果显式指定了 invocant 参数,可以给它一个 additional/alternate 名称 and/or 显式约束它的类型。


疯狂的夸张脚注增加了娱乐性。如果它们让您感到困惑,请忘记您是否阅读过它们。

1单项指的是自然是单一事物的数据,比如数字42OR数据这自然是一个复合事物(如数组),被视为单一事物(如数组)。 (你看到我在那里做了什么吗?)我想指出 $ 符号就像 S(对于单个)覆盖有 I(对于项目),反之亦然。对我来说,这代表了强调任何数据的单项性质,隐藏任何复数方面的想法,即使它实际上是一个数组或其他复合数据项。

2 "scalar" 是一个传统的计算术语。 Wikipedia's Scalar disambiguation page lists "Variable (computing), or scalar, an atomic quantity that can hold only one value at a time" as a definition. Also, a single item aka scalar (all lowercase) is often/usually a Scalar(大写 S),单个项目的特例,即 Single Item container 包含一个 Single Item(可以是复合的数据被视为单一事物)。