Bagaimana cara mengimplementasikannya di dalam Raku

13

Di Perl, menggunakan Moo, Anda bisa menerapkan aroundsubs, yang akan membungkus metode lain di kelas.

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

Bagaimana perilaku ini diimplementasikan dalam Raku , lebih disukai menggunakan a role?

Tyil
sumber

Jawaban:

8

Anda bisa membayangi metode dengan peran dan kemudian menggunakan callwith:

class Foo {
    method meth { say 2 }
}

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

$foo.meth
ugexe
sumber
8

Metode :: Pengubah

Menerapkan fungsi before (), after () dan around () yang dapat digunakan untuk memodifikasi metode kelas yang mirip dengan Moose Perl 5. Ini menggunakan wrap () secara internal, dan mengembalikan handler wrapper, sehingga mudah untuk. Mengembalikan () yang asli.

Ini adalah bagaimana modul mengimplementasikan around:

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

Menggunakan wrap

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

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

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

Karena metode adalah rutinitas, Anda akan memerlukan cara yang sedikit lebih berbelit-belit untuk menangani metode itu sendiri, tetapi selain itu, metode ini persis sama, karena Methods adalah subkelas dari 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þ ← »

Itu $wrappedadalah pegangan yang dapat digunakan, di kemudian hari, untuk membuka bungkusnya jika diperlukan.

Edit : untuk menambahkan kode untuk menangani metode kelas, diambil dari sini , misalnya.

jjmerelo
sumber
Bungkus tidak membungkus metode
ugexe
@ugexe OP merujuk secara eksplisit ke subs. Juga, Anda bisa menggunakannya untuk metode, karena ini MethodadalahRoutine
jjmerelo
Saya pikir kamu bingung. Pertanyaan itu sendiri menyatakan 'membungkus metode lain di dalam kelas.'. MooTidak ada yang seperti membungkus subrutin.
ugexe
@ugexe perbedaan yang sama. Metode adalah Rutinitas, seperti yang saya katakan setelah diedit.
jjmerelo