2013-09-25 2 views
5

디스패치 테이블을 한 번만 초기화하고 하나의 함수에서만 사용할 수 있습니다. 서브 루틴 외부와 동일한 익명 블록으로 디스패치 테이블을 이동하려고했지만 디스패치 테이블은 클로저를 사용하여 함수에 전달 된 개체의 메서드를 호출하므로 함수 외부에서 테이블을 이동하면 개체에 대한 액세스가 분리됩니다 . 이 디스패치 테이블에는 어떤 다른 옵션이 있습니까?클로저 내의 OO 호출을 사용하는 정적 로컬 디스패치 테이블

저는 Perl 5.8을 사용하기 때문에 불행히도 state 변수를 사용할 수 없습니다.

+0

예제에서 볼 수있는 유일한 폐쇄는 익명의 잠수함에서'$ self '를 통해 종료되었습니다 - 실제 코드에 다른 것이 있습니까? 그렇다면 예제를 추가하십시오. –

답변

8

디스패치 테이블의 함수는 $self 이상의 클로저입니다. 매개 변수로 $self을 전달하면이 문제를 해결할 수 있습니다. state 변수는 $self보다 참 폐점이 아니며 명시 적 매개 변수도 필요합니다. 여기

my %funcs = (
    a => sub { shift->_a }, # these are like anonymous methods 
    b => sub { shift->_b }, 
); 

sub foo { 
    my ($self, $var) = @_; 
    my $meth = $funcs{$var} || die "There is no entry $var"; 
    return $self->$meth(); # sugary syntax 
} 

state 나쁜 생각이 왜 데모입니다 :

use 5.010; 
package Foo; 
sub new { my ($c, $v) = @_; bless \$v, $c } 

sub foo { 
    my ($self) = @_; 
    state $cb = sub { say $$self }; 
    $cb->(); 
} 

Foo->new($_)->foo for 1..3; 

출력 :

1 
1 
1 

내부 서브가 폐쇄이지만, $cb의 초기화 만 수행 일단. 따라서 $self 이상의 폐쇄는 첫 번째 것입니다.

+0

설명 주셔서 감사합니다! –