라쿠에서 구현하는 방법


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

어떻게 이런 동작은 구현 될 수 라쿠 바람직를 사용 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

방법 :: 변조기

Perl 5의 Moose와 유사하게 클래스 메소드를 수정하는 데 사용할 수있는 before (), after () 및 around () 함수를 구현합니다. 내부적으로 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þ ← »

방법은 루틴이기 때문에, 당신은 방법 자체에 대한 핸들을 얻을 수있는 약간 더 뒤얽힌 방법이 필요합니다,하지만 이후 그 이외의 방법은 완전히 동일 Method 의 하위 클래스 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þ ← »

$wrapped, 이후에 사용할 수 있습니다 필요한 경우 포장을 푸는하는 핸들입니다.

편집 : 클래스 메소드에 대한 핸들을 가져 오는 코드를 추가 하십시오 (예 : here ).


랩은 방법을 포장하지 않습니다
ugexe

@ugexe OP는 명시 적으로 서브를 의미합니다. 그것이이기 때문에 또한, 당신은 단지, 방법을 위해 그것을 사용할 수 있습니다 MethodA는Routine
jjmerelo가

난 당신이 혼란스러워 생각합니다. 질문 자체에는 '클래스의 다른 메소드를 감싸는 것'이 나와 있습니다. Moos는 서브 루틴을 감싸는 것과는 다릅니다.
ugexe

@ugexe와 같은 차이점. 편집 후에 말했듯이 메소드는 루틴입니다.
jjmerelo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.