Tal vez me falta algo, pero me gustaría saber si hay una buena razón por la cual este código debe compilarse
role L {
method do-l (Int, Int --> Int ) { ... }
}
class A does L {
method do-l (Int $a, Real $b --> Str) {
.Str ~ ": Did you expect Int?" with $a + $b
}
}
my $a = A.new;
say $a.do-l: 2, 3.323
Esto dará salida
5.323: Did you expect Int?
Tenía curiosidad por saber si alguien conoce una forma para que el compilador al menos arroje alguna advertencia con la firma implementada de la función L
.
...
(es cierto que, aunque tiene sentido en el código de producción, aquí puede causar confusión)
role foo {}.new
que se convierte automáticamente en algo así anon class foo does role foo {}.new
) es tan transparente que la gente puede no darse cuenta de que es un juego de palabras, de ahí mi comentario anterior. Es bueno que este juego de palabras por sí solo habilite la alternativa principal a la herencia y a la delegación, es decir, organizar y construir tipos usando la composición , pero en realidad es importante que la gente no pierda de vista por completo que .new
es un juego de palabras.
L.do-l
tiene un método que no coincide, y en cualquier caso, el método de la clase tiene prioridad, por lo que en ambas bases,A
'sdo-l
debe ser llamado. La adición de anInt
y aReal
será aReal
.