Запуск этого фрагмента кода
use v6.d;
role DrawSurface { ... };
enum Surface does DrawSurface <Fire>;
role DrawSurface {
method draw () {
given self {
when Surface::Fire { "f" }
}
}
}
Выдает эту ошибку:
===SORRY!=== Error while compiling /tmp/me.raku
No appropriate parametric role variant available for 'DrawSurface':
Cannot resolve caller (Surface:U); Routine does not have any candidates. Is only the proto defined?
at /tmp/me.raku:5
Как мне это написать, чтобы можно было сделать следующее: Surface::Fire.draw
?
Очень приятное дополнение, мне тоже очень нравится этот ответ, спасибо, что сохранили его. Что касается соревнований, я просто хотел, чтобы на этот вопрос ответили онлайн для других, никаких других вложений в комбо QA :^) Лизмат очень рада опубликовать свое решение.
Перечисления являются конструкциями времени компиляции, поэтому вся логика для создания перечисления должна существовать при его объявлении.
Самое близкое решение - сделать вот так
use v6.d;
enum Surface <Fire>;
role DrawSurface {
method draw ($surface) {
given $surface {
when Surface::Fire { "f" }
}
}
}
say DrawSurface.draw(Fire);
или вот так
use v6.d;
enum Surface <Fire>;
class SurfaceC {
has Surface $.surface;
method draw {
given $!surface {
when Surface::Fire { "f" }
}
}
}
say SurfaceC.new(surface => Fire).draw;
Прямое решение с использованием мультидиспетчеризации.
module DrawSurface {
enum Surface is export <Fire>;
proto draw (Surface $ ) is export {*}
multi draw (Fire) {'f'}
}
import DrawSurface;
say draw Fire;
f
Сочетание с role
.
role DrawSurface {
method draw () {drawp self}
}
enum Surface does DrawSurface <Fire>;
multi drawp(Fire) { 'f' }
say Fire.draw;
f
хороший! - особенно второй вариант с role
Кто-нибудь знает, почему Лиз удалила свой ответ? (Сохранено в списке, чтобы каждый мог это увидеть.) Я понимаю, что Дмитрий (привет, Дмитрий) проделал хорошую комбинацию QA, поэтому она, возможно, не хотела «конкурировать», но ее ответ все равно казался очень полезным.