Perl 如何使用鼠标委托给数组的第一个元素?
我有一个对象,它包含一堆对象。对象表示当前状态,堆栈中的每个对象都在特定的嵌套级别上保持该状态Perl 如何使用鼠标委托给数组的第一个元素?,perl,delegates,mouse,moose,Perl,Delegates,Mouse,Moose,我有一个对象,它包含一堆对象。对象表示当前状态,堆栈中的每个对象都在特定的嵌套级别上保持该状态 package State; use Mouse; use RealState; has state_stack => { is => 'rw', isa => 'ArrayRef[RealState]', default => sub { return [RealState->new] } }; 我想将状态
package State;
use Mouse;
use RealState;
has state_stack => {
is => 'rw',
isa => 'ArrayRef[RealState]',
default => sub {
return [RealState->new]
}
};
我想将状态委托给State->State\u stack->[0]
。如何使用鼠标高效地实现这一点(因此没有元黑客攻击)。我不能使用Moose,不能有任何依赖项(我捆绑了Mouse::Tiny)
“你不能”很好,我会写一个
自动加载
你不能直接加载,但是有一个比自动加载更好的方法。也就是说,RealState->meta->get_all_method_names()提供在RealState中定义的方法名
#!perl
use 5.14.0;
package RealState {
use Mouse;
sub foo { 'foo' }
__PACKAGE__->meta->make_immutable;
}
package State {
use Mouse;
has stack => (
is => 'rw',
isa => 'ArrayRef',
default => sub { [ RealState->new ] },
);
# define delegates for stack->[0]
my $meta = __PACKAGE__->meta;
foreach my $name(RealState->meta->get_all_method_names) {
next if Mouse::Object->can($name); # avoid 'new', 'DESTROY', etc.
# say "delegate $name";
$meta->add_method($name => sub {
my $self = shift;
$self->stack->[0]->$name(@_);
});
}
$meta->make_immutable;
}
my $state = State->new();
say $state->foo();
谢谢我更喜欢更动态的东西,堆栈中的其他元素可能是带有扩展的子类的实例。我想我可以在每次更改堆栈时重新运行,但这种情况并不经常发生。我必须去掉不可变的标志。它是否需要一个
下一个if State->can($name)
?更动态!如果是这样,自动加载是一种更聪明的方式。或者,如果我了解您的话,我会定义sub-first{$state->stack->[0]}并使用$stack->first->foo(),这既简单又有效。