2013-09-25 10 views
5

Sadece bir kez başlatmak istediğim bir gönderme tablom var ve sadece bir işlev tarafından kullanılması amaçlanıyor. Gönderim tablosunu alt programın dışına ve aynı anonim bloğa taşımayı umuyordum, fakat dağıtım tablosu, işleve geçirilen nesnenin yöntemlerini çağırmak için kapaklar kullandığı için, tabloyu işlev dışına taşımak, nesneyi nesneye erişimden ayırır. . Bu sevk tablosu için başka seçeneklerim var mı?OO çağrıları kapalı olarak statik yerel gönderim tablosu

Perl 5.8 kullanıyorum, bu yüzden ne yazık ki state değişkenlerini kullanamıyorum. dağıtım tablosunda

sub foo { 
    my ($self, $var) = @_; 

    my %funcs = (
    a => sub { $self->_a() }, 
    b => sub { $self->_b() }, 
    ... 
); 

    return $funcs{$var}->(); 
} 
+0

Örneğindeki görebildiğim tek kapak anonim alt kuruluşlarda '$ self'in üzerindedir - gerçek kodda başkaları var mı? Öyleyse, lütfen bir örnek ekleyin. –

cevap

8

Kişisel fonksiyonları $self üzerinde kapanışları vardır. Parametre olarak $self'u iletirseniz, bunun etrafından dolaşabilirsiniz. state değişkenlerinin, $self üzerinden gerçek kapatmalar olmadığını ve ayrıca açık bir parametre gerektirdiğini unutmayın. İşte

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 kötü bir fikir olacağını neden serer:

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; 

Çıktı:

1 
1 
1 

iç alt kapatma olmakla $cb ilklendirmesinin sadece gerçekleştirilir bir Zamanlar. Böylece $self'un üstü kapalı olanıdır.

+0

Açıklama için teşekkürler! –

İlgili konular