2013-06-17 2 views
0

Я работаю с некоторым кодом в Perl, который хочет, чтобы я передал ему метод. Но я хотел бы сохранить некоторое состояние о том, что происходит в методе. Я знаю, что для этого могу использовать глобальную переменную, но я бы предпочел что-то немного более чистое/объектно-ориентированное. Есть ли способ использовать Moose для создания объекта functor/function?Использование Moose в Perl для реализации функтора

+0

что вы имеете в виду под "передать метод к нему"? Я подозреваю, что вы можете просто означать закрытие, а Муз даже не требуется делать то, что вы хотите. более конкретный пример был бы полезен. – ysth

ответ

5

Вам просто нужно закрыть.

sub make_closure { 
    my ($name) = @_; 
    my @greets = ('Good morning', 'Good afternoon', 'Good evening', 'Good night'); 
    my $next = 0; 
    return sub { "$greets[ $next++ % @greets ], $name" }; 
} 

my $joe = make_closure("Joe"); 
my $jane = make_closure("Jane"); 

say $joe->(); # Good morning, Joe 
say $joe->(); # Good afternoon, Joe 
say $jane->(); # Good morning, Jane 
say $jane->(); # Good afternoon, Jane 
say $jane->(); # Good evening, Jane 
say $joe->(); # Good evening, Joe 

Другой путь был бы сделать объект, который overloads&{}.

use Moose; 

use overload '&{}' => \&call; 

has code => (is => 'rw'); 
has called => (is => 'rw', default => 0); 

sub call { 
    my ($self) = @_; 
    $self->called($self->called() + 1); 
    return $self->code; 
} 

my $o = __PACKAGE__->new(code => sub { say "called!" }); 
$o->();   # called! 
$o->();   # called! 
say $o->called; # 2 
+0

Добавлен ответ. – ikegami

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