Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使用鼠标委托给数组的第一个元素?_Perl_Delegates_Mouse_Moose - Fatal编程技术网

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(),这既简单又有效。