On 27/06/14 10:07, Kamil Kułaga wrote:
Hi,
I would like to ask for help in understanding difference between this code:
use v6;
role X {
multi method xyz(Any $a) {say "Class X"}
}
class Y does X {
multi method xyz(Any $a) {say "Class Y"}
}
say Y.new.xyz(1);
$ perl6 tst.pl
Ambiguous call to 'xyz'; these signatures all match:
:(Y: Any $a, *%_)
:(Y: Any $a, *%_)
in block at tst.pl:26
And this code:
use v6;
class X {
multi method xyz(Any $a) {say "Class X"}
}
class Y is X {
multi method xyz(Any $a) {say "Class Y"}
}
say Y.new.xyz(1);
$ perl6 tst.pl
Class Y
True
It is hard to google such common words like is and does :)
Hey Kamil,
What happens when you "does" a role in a class, you "mix in" all the
methods at the "same level", basically as if you had copy-pasted the
method declarations over. That's why you get the error that the call to
xyz is ambiguous.
When you "is" a class, you derive from it. That's why the multi method
X::xyz gets "overwritten" by Y::xyz, as the signature is identical.
At least that's my understanding.
Btw, you can also "is" a role, in which case it will get "punned" into a
class. That operation is equivalent to declaring a class with an empty
body that "does" the given role. So in the upper example, with role X
and class Y, you could "is X" and get the same behavior as in the lower
example.
Hope to help (and hope what I wrote is actually accurate)
- Timo