2013-06-17 4 views
0

Perl에서 메소드를 전달하고자하는 일부 코드로 작업하고 있습니다. 그러나 나는 그 방법에서 일어나는 일에 대해 어떤 상태를 유지하고 싶다. 나는 이것을 위해 전역 변수를 사용할 수 있다는 것을 알고 있지만, 나는 좀 더 깨끗한/객체 지향적 인 것을 선호한다. Functor/Function 객체를 만들기 위해 Moose를 사용하는 방법이 있습니까?Perl에서 Moose를 사용하여 Functor 구현하기

+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