클로저가 필요합니다.
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
당신이 무엇을 의미합니까 "그것을하는 방법을 전달합니다"? 나는 당신이 폐쇄를 의미 할 수도 있고 무스가 당신이 원하는 것을 할 필요조차 없다고 생각합니다. 좀 더 구체적인 예가 도움이 될 것입니다. – ysth