Курс языка программирования 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

Комментарии

  1. В отличие от прежних примеров, Dancing не заменяет существующий метод — она приносит совершенно новый метод dance, о котором Robot ничего не знает.

  2. Robot.new but Dancing подмешивает роль в один-единственный объект во время выполнения, поэтому $dancing умеет и speak (из класса), и dance (из роли). Обычный $plain научился только speak.

  3. Дополнительная способность принадлежит именно этому объекту, а не классу Robot. Вызов $plain.dance привёл бы к ошибке, потому что $plain роль не получал.

Навигация по курсу

Танцующий робот   |   Интроспекция объектов