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?

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

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(); });
}

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.