Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Классы и объекты / Роли / Exercises / Танцующий робот
Решение: Танцующий робот
Вот один из возможных вариантов решения задачи.
Код
role Dancing {
method dance {
'spinning around';
}
}
class Robot {
method speak {
'beep';
}
}
my $plain = Robot.new;
my $dancing = Robot.new but Dancing;
say $plain.speak;
say $dancing.speak;
say $dancing.dance;🦋 Исходный код можно найти в файле dancing-robot.raku.
Вывод
beep
beep
spinning aroundКомментарии
В отличие от прежних примеров,
Dancingне заменяет существующий метод — она приносит совершенно новый методdance, о которомRobotничего не знает.Robot.new but Dancingподмешивает роль в один-единственный объект во время выполнения, поэтому$dancingумеет иspeak(из класса), иdance(из роли). Обычный$plainнаучился толькоspeak.Дополнительная способность принадлежит именно этому объекту, а не классу
Robot. Вызов$plain.danceпривёл бы к ошибке, потому что$plainроль не получал.