Cursus Raku / Addendum 🆕 / Genera et machinae textuales / Obiecta et classes / Exercises / Figurae partem communem habentes
Solutio: Figurae partem communem habentes
Ecce solutio possibilis huius exercitationis.
Codex
role Shape {
method area { ... }
}
class Circle does Shape {
has $.radius;
method area { 3.14159 * $.radius ** 2 }
}
class Square does Shape {
has $.side;
method area { $.side ** 2 }
}
sub describe(Shape $shape) {
say "{$shape.^name}: {$shape.area}";
}
for Circle.new(radius => 2), Square.new(side => 3) -> $shape {
describe($shape);
}🦋 Inveni codicem fontem in archivo shapes-role.raku.
Exitus
Circle: 12.56636
Square: 9Commentarii
Stricte, vocatio
$shape.areasine parte communi omnino operaretur. Raku methodos secundum nomen ipso momento vocationis resolvit, itaque dum unumquodque obiectum forte methodumareahabet, anulus currit — hoc typizatio anatis appellatur. Quid ergo pars communis nobis hic revera praestat? Duas garantias.Pars communis genus est quod postulare potes.
describeutsub describe(Shape $shape)declaratur, itaque sola obiecta quaeShapeagunt accipit et quidquid aliud antequam corpus currit reicit. Trade illi numerum simplicem et programma compilari recusat:describe(42); # Calling describe(Int) will never work with declared signature (Shape $shape)
Sine parte communi nullum tale genus est — subprogramma typizatione anatis nixum quodlibet argumentum acciperet et solum postea, penitus intus, cum
.areaattingeret, rumperetur.Pars communis pactum est.
areaut stipitem declarare (method area { ... }) omnem classem quae partem agit cogit propriamareapraebere. Illam oblivisce, et error latere non potest:class Triangle does Shape { has $.base; has $.height; } # Method 'area' must be implemented by Triangle because it is required by roles: Shape. my $t = Triangle.new(base => 3, height => 4); say $t.area; # Stub code executed
Rakudo methodum absentem nuntiat simul atque classis componitur — programma compilari recusat antequam unum obiectum
Triangleexsistat. Et etiam in implementatione quae definitionem classis accipit, error ad summum tunc emergit cum methodus adhibetur: stipes{ ... }a parte communi hereditatus codex verus est qui cumStub code executedmoritur simul atque quis illum vocat.$shape.^nameobiectum de nomine classis suae rogat, itaque idemdescribeunumquemque effectum recte notat sine genere ante cognito.