你如何动态调用对象的方法?

时间:2011-10-18 22:22:24

标签: perl oop function dynamic-function

Perl中的

我知道你可以使用eval和* {$ func_name}来动态调用函数,但是如何使用对象的方法呢?

例如

EZBakeOven
  sub make_Cake { ... }
  sub make_Donut { ... }
  sub make_CupCake { ... }
  sub make_Soup { ... }

  sub make{
    my($self,$item) = @_;
    if( defined $self->make_$item ){ #call this func if it exists
      $self->make_$item( temp => 300, with_eggs => true ); 
    }
  }

所以如果我说像

那样的话
$self->make('Cake');
#or maybe I have to use the full method name
$self->make('make_Cake');

它会调用

$self->make_Cake();

2 个答案:

答案 0 :(得分:3)

您应该可以执行以下操作:

sub make {
  my ($self, $item) = @_;
  my $method = "make_$item";
  $self->$method(whatever);
}

修改:您可能还想使用can()来确保调用可以调用的方法:

sub make {
  my ($self, $item) = @_;
  my $method = "make_$item";
  if ($self->can($method)) {
    $self->$method(whatever);
  } else {
    die "No such method $method";
  }
}

编辑2:实际上,现在我想起来了,我不确定你是否真的能做到这一点。我之前编写过的代码做了类似的事情,但它没有使用对象,它使用了一个类(所以你在一个类中调用一个特定的函数)。它也可以用于对象,但我无法保证。

答案 1 :(得分:0)

正如@CanSpice建议使用can来检查类和对象中存在的方法。 can返回对方法的引用(如果存在),否则返回undef。 您可以使用返回的引用直接调用该方法。

以下示例在package / class context中调用该方法。 __PACKAGE__返回当前的包/类名。

if ( my $ref = __PACKAGE__->can("$method") ) {
    &$ref(...);
}
相关问题