No such method for invocant of type

2019-06-19 14:25发布

I've created a class which contains multi definitions for function overloading, however when I try to call the class and the overloaded method, it throws an error. A working example which can be run to produce this error is shown below:

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);

Error:

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

I may be doing this wrong, can someone point me to the correct way to do this?

Edit: I'm effectively trying to make this a module, which I can use for other things.

标签: perl6
3条回答
Fickle 薄情
2楼-- · 2019-06-19 14:35

The reason you're getting the no such method error is that multi defaults to sub unless told other wise. You need multi method test

查看更多
闹够了就滚
3楼-- · 2019-06-19 14:36

Other answers have to helped explain the usage for multi method but optional parameters might be a simpler way to get the same result:

#!/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);
查看更多
放荡不羁爱自由
4楼-- · 2019-06-19 14:51

You need add the self keyword before your test method:

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);

note: In Perl 6 class, use method keyword to declare a method.

查看更多
登录 后发表回答