Cách thực hiện xung quanh trong Raku


13

Trong Perl, bằng cách sử dụng Moo, bạn có thể triển khai aroundsubs, sẽ bao quanh các phương thức khác trong một lớp.

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

Làm thế nào hành vi này có thể được thực hiện trong Raku , tốt nhất là sử dụng một role?

Câu trả lời:


8

Bạn có thể tạo bóng cho phương thức với vai trò và sau đó sử dụng 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

Phương thức :: Sửa đổi

Các hàm thực hiện trước các hàm (), after () và quanh () có thể được sử dụng để sửa đổi các phương thức lớp tương tự như Moose của Perl 5. Nó sử dụng bọc () bên trong và trả về trình xử lý trình bao bọc, do đó rất dễ dàng để .restore () bản gốc.

Đây là cách mô-đun thực hiện around:

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

6

Sử dụng wrap

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

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

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

Vì các phương thức là các thói quen, bạn sẽ cần một cách phức tạp hơn một chút để có thể xử lý chính phương thức đó, nhưng ngoài ra, phương thức này hoàn toàn giống nhau, vì Methods là một lớp con của 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þ ← »

Các $wrappedlà một xử lý mà có thể được sử dụng, sau này, để Unwrap nó nếu cần thiết.

Chỉnh sửa : để thêm mã để xử lý phương thức lớp, lấy từ đây , ví dụ.


Phương pháp quấn không quấn
ugexe

@ugexe OP đề cập rõ ràng đến subs. Ngoài ra, bạn chỉ có thể sử dụng phương thức đó cho các phương thức, vì đó Methodlà mộtRoutine
jjmerelo

Tôi nghĩ bạn đang bối rối. Bản thân câu hỏi 'bao quanh các phương thức khác trong một lớp.'. Moos xung quanh không có gì giống như gói một chương trình con.
ugexe

@ugexe cùng khác biệt. Phương thức là thói quen, như tôi đã nói sau khi chỉnh sửa.
jjmerelo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.