Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No such method <name> for invocant of type <class>

Tags:

raku

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.

like image 280
madcrazydrumma Avatar asked Jul 12 '18 02:07

madcrazydrumma


3 Answers

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.

like image 164
chenyf Avatar answered Jan 01 '23 23:01

chenyf


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

like image 35
Scimon Proctor Avatar answered Jan 01 '23 22:01

Scimon Proctor


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);
like image 41
mr_ron Avatar answered Jan 01 '23 22:01

mr_ron