我想将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/

    10-13 03:08