3

evalPerlでは、関数を動的に使用および呼び出すことができることを知って*{$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();
4

2 に答える 2

4

次のようなことができるはずです。

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:実際、私はそれについて考えたので、あなたが本当にそれを行うことができるかどうかはわかりません。私が以前に書いたコードはそのようなことをしますが、それはオブジェクトを使用せず、クラスを使用します(したがって、クラス内の特定の関数を呼び出しています)。オブジェクトに対しても機能する可能性がありますが、保証することはできません。

于 2011-10-18T22:24:06.940 に答える
2

@CanSpiceのようcanに、クラスとオブジェクトにメソッドが存在するかどうかを確認するために使用することを提案しました。 canメソッドが存在する場合はその参照を返し、存在しない場合はundefを返します。返された参照を使用して、メソッドを直接呼び出すことができます。

次の例では、パッケージ/クラスコンテキストでメソッドを呼び出します。__PACKAGE__現在のパッケージ/クラス名を返します。

if ( my $ref = __PACKAGE__->can("$method") ) {
    &$ref(...);
}
于 2018-03-15T09:37:18.850 に答える