index()错误消息对第三个参数不正确?

时间:2018-05-04 16:45:19

标签: type-conversion signature perl6 error-messaging

sub count-a {
    my $word = "banana";
    my $count = 0;
    my $foo;      #  Source of error: $foo intentionally not given a value.
                 #  The value ought to be zero.

    while True {
      $foo = index $word, "a", $foo;
      last unless $foo.defined;
      $foo++;
      $count++
  }
  return $count;
}

say count-a;

此错误消息是否有误?

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, *%_)
in sub count-a at scrap.p6 line 11
in block <unit> at scrap.p6 line 18

错误消息说index()将接受&#39; Any&#39;的第三个参数,这是我用$ foo.WHAT验证时给出的。

3 个答案:

答案 0 :(得分:3)

third parameter of index is defined as an Int that is actually coerced to CoolCoolclass that can represent either a number or a string in Perl 6)。但是你定义它的方式my $foo(其类型将是&#34;任何&#34;)它不能被识别为任何一个。只要您为其提供值"0"0,就可以使用。

my $foo = 0;  

因为index的签名会正确识别该类型。

答案 1 :(得分:2)

So, just to clarify, the error is saying

caller [of subroutine] index [passing params of type] (Str: Str, Any)

cannot be resolved [because it does not match any of] The available index() definitions:

>>> di={tuple(changeable_list):changeable_list}
>>> di
{(22,): [22]}

==========

imho, this error wording will be harder to understand esp. for newbies where it occurs on built-in subroutines due to the thorough use of signature tools such as high order types (e.g. Cool), smilies, $:(whatever that is) and parser internal names such as $needle

maybe could do some magic such as “likely 3rd param caused error as defns require it to be Int:D or Cool:D”

答案 2 :(得分:1)

我将讨论如何在本答案的后半部分改进错误消息。但首先:

  

此错误消息是否有误?

嗯,你已经误解了它,所以从那个意义上说它是错的。

  

错误消息显示index()将接受

更准确地说,信息开始了:

Cannot resolve caller 

指的是index() 来电,即不是&#34; index()会接受什么&#34;而是代码实际要求的内容

index $word, "a", $foo;
  

Any的第三个参数,就是我在使用$foo.WHAT进行验证时给出的内容。

是的,Any是&#34的第三个的类型;它给出了什么&#34;,但它指的是第三个{{3}的值调用index(),而不是index() 定义的第三个argument

可用的index()定义是:

index(Str:D $: Cool:D $needle, *%_)
index(Str:D $: Str:D $needle, *%_)
index(Str:D $: Cool:D $needle, Cool:D $pos, *%_)
index(Str:D $: Str:D $needle, Int:D $pos, *%_)

这四个具有不同parameter的定义中,没有一个包含第三个参数,它将接受调用中给定的相应第三个参数 ,存储在电话signatures中。

关于如何改进错误消息的想法

Perl 6文化包含了一个很棒的错误消息&#34;焦点,可以说是之前出现了相关的混淆(例如导致capture的交流)。

让我们进一步剖析这一点,以便我们看看我们是否提出了明确改进信息或某些文档或其他任何好的想法。

我认为您的误解源于对参数(和调用/捕获)与参数(以及定义/签名)之间的区别缺乏明确性,特别是您对错误消息的这一部分的解释:

index(Str: Str, Any)

index 之后的位就像签名一样,即看起来就像一个列表,好吧,好事(如果在index()电话中使用index()定义,我们可以将其称为&#34; pargs&#34;)的类型。

但它不是签名,是index()定义的一部分。相反,它实际上是与index()调用中的参数列表相对应的类型列表。

我认为这种捕获分析和显示是专门构建的,以便错误消息的读者更容易找出将捕获绑定到匹配签名时出错的地方。

不幸的是,虽然如果您已经理解了这个答案,它可能现在可以为您服务,但我们仍然留下了您的初步解释导致您认为错误消息完全错误的问题 - - 和其他人可能会犯同样的错误。

无论如何,我认为在我的回答中有足够的讨论。如果您想继续这样做,请在此答案和/或您的问题中添加评论。我到目前为止所写的内容对你有意义吗?有什么想法吗?