我在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, *%_)
答案 0 :(得分:9)
$:
是两个不同的无关标记,$
和:
,它们一起被粉碎。
$
表示单个项目 1 又称标量 2 。
单项/标量没有给出名称,因此无法引用它。已经足够的参数(Str:D
)让你和编译器知道这个参数是标量(单个字符串)。无论哪种方式,$
都是多余的Elizabeth has made a related change。
:
是一个特殊的参数分隔符。 (通常的参数分隔符是逗号,
。)
它只能在方法或独立签名的第一个参数之后立即使用。它不能用于不是方法的例程的签名。
如果在签名中的第一个参数之后用作参数分隔符,则会将该参数标记为与方法"invocant"对应。
(如果不使用,则调用参数是隐式的。)
无论如何,相应的调用参数将到达,并且别名为self
,无论签名是否明确列出了调用参数。但是如果明确指定了invocant参数,则可以为其提供附加/备用名称和/或明确约束其类型。
疯狂的顶级脚注增加娱乐性。如果他们让你感到困惑,就忘记你曾经读过它们。
1 单个项目指的是自然是单一事物的数据,例如数字42
, OR 数据,这些数据自然是复合数据(如一个数组)被视为一个单一的东西(就像一个数组)。 (你看到我在那里做了什么吗?)我想指出一个$
符号就像一个 S (对于单个)覆盖着 I (对于项目),反之亦然。对我而言,这代表了强调任何数据的单项性质的想法,隐藏任何复数方面,即使它实际上是一个数组或其他复合数据项。
2 "标量"是一个传统的计算术语。 Wikipedia's Scalar
disambiguation page列出" Variable (computing)
或标量,一次只能包含一个值的原子数量"作为一个定义。此外,单个项目标量(全部小写)通常/通常为Scalar
(大写 S
),这是一个特例 S ingle I tem 容器的项目包含 S ingle 我 tem(可以将复合数据视为单一内容)。
答案 1 :(得分:0)
:
将第一个参数标记为invocant。
my $word = "bananarama";
say $word.index( "r", 0 );
在这种情况下,它表示将调用者视为标量,因为它受到单个$