-->

No such method for invocant of type

2019-06-19 14:39发布

问题:

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.

回答1:

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.



回答2:

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:

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


标签: perl6