2013-09-25 2 views
5

У меня есть таблица отправки, которую я хочу инициализировать только один раз и предназначен только для использования одной функцией. Я надеялся переместить таблицу рассылки вне подпрограммы и в тот же анонимный блок, но так как в таблице рассылки используются замыкания для вызова методов для объекта, переданного в функцию, перемещение таблицы вне функции отделяет ее от доступа к объекту , Какие еще варианты для этой таблицы отправки?Статическая локальная таблица рассылки с вызовами OO в пределах замыканий

Я использую Perl 5.8, поэтому, к сожалению, я не могу использовать переменные state.

+0

Единственное замыкание, которое я вижу в примере, - это над '$ self' в анонимных subs - есть ли другие в реальном коде? Если да, добавьте пример. –

ответ

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

Спасибо за объяснение! –

Смежные вопросы