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.
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.
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
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With