Как написано, вы можете обойтись без
$tests->[$index]();
, потому что методы в вашем вопросе не используют $self
.
Вы можете передать $instance
явно, но этонеуклюжий.Лучше было бы смоделировать делегатов с замыканиями:
sub sublist {
my $self = shift;
my $sublist;
for (qw/ sub1 sub3 sub2 /) {
my $meth = $_;
push @$sublist => sub { $self->$meth() };
}
return $sublist;
}
Если вы предпочитаете быть кратким, используйте
sub sublist {
my $self = shift;
return [ map { my $meth = $_; sub { $self->$meth() } }
qw/ sub1 sub3 sub2 / ];
}
Вызов случайного числа все еще
$tests->[$index]();
но теперь методы получают инвоканты.
Обновление
Получение подрефсов с помощью can
представляется ненужной сложностью.Если подойдет список имен методов, вызываемых во время выполнения, то вы можете значительно упростить свой код:
sub sublist {
my $self = shift;
return [ qw/ sub1 sub3 sub2 / ];
}
Ниже мы вызываем их все для целей тестирования, но вы также можете увидеть, как вызыватьтолько один:
foreach my $method (@$subs) {
my $x = $instance->$method();
say "$method returned $x";
}
Выход:
in sub 1
sub1 returned 1
in sub 3
sub3 returned 3
in sub 2
sub2 returned 2