디스패치 테이블의 함수는 $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
이상의 폐쇄는 첫 번째 것입니다.
예제에서 볼 수있는 유일한 폐쇄는 익명의 잠수함에서'$ self '를 통해 종료되었습니다 - 실제 코드에 다른 것이 있습니까? 그렇다면 예제를 추가하십시오. –