On 27 Jun 2014, at 09:25, Timo Paulssen <t...@wakelift.de> wrote:
> 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)

FWIW, I’m not sure why the first case is actually a problem.  I would expect 
this error if both X and Y were a role composed into a class Z.


Liz

Reply via email to