Raku'da nasıl uygulanır


13

Perl'de, kullanarak Moo, aroundbir sınıftaki diğer yöntemlerin etrafına sarılacak subs uygulayabilirsiniz .

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";
};

Bu davranış Raku'da tercihen a kullanılarak nasıl uygulanabilir role?

Yanıtlar:


8

Yöntemi rol ile gölgeleyebilir ve sonra kullanabilirsiniz 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

Yöntem :: Düzenleyiciler

Perl 5 Moose'a benzer şekilde sınıf yöntemlerini değiştirmek için kullanılabilen, önce (), after () ve around () işlevlerini uygular. Dahili olarak wrap () kullanır ve sarıcı işleyicisini döndürür, böylece orijinali .restore () yapmak kolaydır.

Modül şu şekilde uygulanır around:

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

6

kullanım wrap

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

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

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

Yöntemler rutin olduğundan, yöntemin kendisini ele almak için biraz daha kıvrımlı bir yola ihtiyacınız olacak, ancak bunun dışında, yöntem tamamen aynıdır, çünkü Methods bir s alt sınıfıdır.Routine

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

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

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

Daha $wrappedsonra gerektiğinde paketini açmak için kullanılabilen bir tanıtıcıdır.

Düzenle : Örneğin , buradan alınan sınıf yöntemini ele almak için kod eklemek için .


Wrap yöntemleri
sarmaz

@ugexe OP açıkça subs anlamına gelir. Ayrıca, bu sadece yöntemler için kullanabilirsiniz, çünkü bu MethodbirRoutine
jjmerelo

Bence kafan karıştı. Sorunun kendisi 'bir sınıftaki diğer yöntemlerin etrafına dolanır.' Mooetrafında bir altyordam sarmak gibi bir şey değildir.
ugexe

@ugexe aynı fark. Düzenlemelerden sonra söylediğim gibi Yöntemler Rutindir.
jjmerelo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.