Как реализовать в Раку


13

В Perl, используя Moo, вы можете реализовать aroundподпрограммы, которые обернутся вокруг других методов в классе.

around INSERT => sub {
    my $orig = shift;
    my $self = shift;

    print "Before the original sub\n";
    my $rv  = $orig->($self, @_);
    print "After the original sub\n";
};

Как это поведение может быть реализовано в Raku , предпочтительно с помощью role?

Ответы:


8

Вы можете скрыть метод с ролью и затем использовать callwith:

class Foo {
    method meth { say 2 }
}

my $foo = Foo.new but role :: {
    method meth(|c) { say 1; callwith(|c); say 3 }
};

$foo.meth

8

Метод :: Модификаторы

Реализует функции before (), after () и around (), которые можно использовать для изменения методов класса, аналогично Moose в Perl 5. Он использует wrap () внутри и возвращает обработчик оболочки, так что легко .restore () оригинал.

Вот как модуль реализует around:

sub around ($class, $method-name, &closure) is export
{
  $class.^find_method($method-name).wrap(method { closure(); });
}

6

использование wrap

sub bar () { return "baþ" };

my $wrapped = &bar.wrap( { " → " ~ callsame() ~ " ← " } );

say bar(); # OUTPUT:  «→ baþ ← »

Так как методы являются подпрограммами, вам понадобится немного более сложный способ получить представление о самом методе, но в остальном метод точно такой же, поскольку Methods является подклассом Routines

class Baz {
    method bar () { return "baþ" };
}

my &method_bar = Baz.^find_method("bar");
my $wrapped = &method_bar.wrap( { " → " ~ callsame() ~ " ← " } );

say Baz.bar(); # OUTPUT:  «→ baþ ← »

Это $wrappedдескриптор, который можно использовать позже, чтобы развернуть его при необходимости.

Редактировать : добавить код, чтобы получить дескриптор метода класса, взятого отсюда , например.


Обертывание не оборачивает методы
ugexe

@ugexe OP явно ссылается на сабвуферы. Кроме того , вы можете просто использовать , что для методов, так как это MethodявляетсяRoutine
jjmerelo

Я думаю, что вы в замешательстве. Сам вопрос гласит: «Обтекание других методов в классе». MooS вокруг это не что иное, как завершение подпрограммы.
Ugexe

@ugexe та же разница. Методы рутинные, как я уже сказал после редактирования.
Jjmerelo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.