【问题标题】:No such method <name> for invocant of type <class><class> 类型的调用者没有这样的方法 <name>
【发布时间】:2018-07-12 02:45:07
【问题描述】:

我创建了一个包含multi 函数重载定义的类,但是当我尝试调用该类和重载方法时,它会引发错误。可以运行以产生此错误的工作示例如下所示:

class Test
{
    multi test(@data) {
        return test(@data, @data.elems);
    }

    multi test(@data, $length) {
        return 0;
    }
}

my @t = 't1', 't2', 't3';
say Test.test(@t);

错误:

No such method 'test' for invocant of type 'Test'. Did you mean any of these?
    List
    Set
    gist
    list

  in block <unit> at test.p6 line 13

我可能做错了,有人可以指出正确的方法吗?

编辑:我正在有效地尝试把它变成一个模块,我可以将它用于其他事情。

【问题讨论】:

标签: raku


【解决方案1】:

您需要在test 之前添加self 关键字方法

class Test
{

    multi method test(@data) {
        return self.test(@data, @data.elems);
    }

    multi method test(@data, $length) {
        return 0;
    }

}

my @t = 't1', 't2', 't3';
say Test.test(@t);

注意:在 Perl 6 类中,使用 method 关键字声明方法。

【讨论】:

  • 鉴于@madcrazydrumma 的问题中的错误消息是由于未使用method 关键字,您的答案读起来有点奇怪(至少对我而言),根据您在答案末尾的注释,根据您的开场解释,而不是不使用self.。您的回答是正确的,并且 OP 已接受它,我也会接受,所以我只是留下此评论,因为我认为它可能对未来的读者有所帮助。
【解决方案2】:

您收到no such method 错误的原因是multi 默认为sub,除非另有说明。你需要multi method test

【讨论】:

    【解决方案3】:

    其他答案必须有助于解释 multi method 的用法,但可选参数可能是获得相同结果的更简单方法:

    #!/usr/bin/env perl6
    use v6;
    
    class Test
    {
        method test(@data, Int $length = @data.elems) {
            say 'In method test length ', $length, ' data ', @data.perl;
            return 0;
        }
    }
    
    my @t = 't1', 't2', 't3';
    say Test.test(@t);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2014-03-25
      • 2018-04-09
      • 2014-03-12
      • 1970-01-01
      • 2012-10-02
      相关资源
      最近更新 更多