Смешивание ролей в вызываемых - PullRequest
0 голосов
/ 29 мая 2018

Теоретически, вы можете смешивать роль в объект во время выполнения .Поэтому я пытаюсь сделать это с помощью функции:

my &random-f = -> $arg  { "Just $arg" };

say random-f("boo");

role Argable {
    method argh() {
        self.CALL-ME( "argh" );
    }
}

&random-f does Argable;

say random-f.argh;

В роли я использую self для ссылки на уже определенную функцию и CALL-ME для фактического вызовафункция в роли.Однако это приводит к следующей ошибке:

Too few positionals passed; expected 1 argument but got 0
in block <unit> at self-call-me.p6 line 5

Я действительно понятия не имею, кто ожидает 1 аргумент.Теоретически, это должна быть функция CALL-ME, но кто знает.Исключение self. приводит к другой ошибке: CALL-ME used at line 11.Добавление does Callable к Argable (после возврата себя) приводит к той же ошибке.Можно ли это сделать?Есть идеи как?

1 Ответ

0 голосов
/ 29 мая 2018

В вашем коде есть две неправильные вещи:

say random-f.argh;  # *call* random-f and then call .argh on the result

Вы хотите позвонить .argh на Callable так:

say &random-f.argh;

Во-вторых, вы должны просто иметь возможностьдля вызова self: вы можете настроить это в сигнатуре .argh метода:

method argh(&self:) {

Таким образом, окончательный код становится:

my &random-f = -> $arg  { "Just $arg" };

say random-f("boo");

role Argable {
    method argh(&self:) {
        self( "argh" );
    }
}

&random-f does Argable;

say &random-f.argh;
...