问题
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);
来源:https://stackoverflow.com/questions/51296615/no-such-method-name-for-invocant-of-type-class