我想将OO包中的一些子放入数组(也在包内)中,以用作调度表。像这样
package Blah::Blah;
use fields 'tests';
sub new {
my($class )= @_;
my $self = fields::new($class);
$self->{'tests'} = [
$self->_sub1
,$self->_sub2
];
return $self;
}
_sub1 { ... };
_sub2 { ... };
我不完全确定此语法吗?
$self->{'tests'} = [
$self->_sub1
,$self->_sub2
];
或者
$self->{'tests'} = [
\&{$self->_sub1}
,\&{$self->_sub2}
];
或者
$self->{'tests'} = [
\&{_sub1}
,\&{_sub2}
];
我似乎无法在OO程序包中使用它,但是它以过程方式非常简单,而且我还没有找到OO的任何示例。
任何帮助深表感谢,
伊恩
最佳答案
尽管Robert P的答案可能对您有用,但它存在在过程中很早就修复分发的问题。我倾向于尽早解决这些方法,因此在您要使用它们之前,我会将tests
数组中的内容保留为方法名称:
$self->{tests} = [
qw( _sub1 _sub2 )
];
动态语言的优势在于,只要您愿意决定要发生什么,就可以等待。
当您要运行它们时,可以按照罗伯特已经指出的相同过程进行。我会在其中添加一个接口(interface):
foreach my $method_name ( $obj->get_test_methods )
{
$obj->$method_name();
}
如果不将测试与现有方法名称绑定(bind)在一起,那可能会更好:
foreach my $method_name ( $obj->get_test_methods )
{
$obj->run_test_named( $method_name );
}
然后,该
run_test_named
可以成为您的调度程序,它可以非常灵活: sub run_test_named
{
my( $self, $name ) = @_;
# do anything you want, like in Robert's answer
}
您可能想做的一些事情:
当您将决定要做的事情与实现分开时,您将拥有更多的自由。不仅如此,下次您调用相同的测试名称时,您可以做一些不同的事情。
关于perl - 如何在Perl OO模块中实现调度表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2791833/