2011-10-18 8 views
2

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(); 

答えて

3

を呼び出すように:

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

編集:また、あなたは呼び出すことができるメソッド呼び出していることを確認するcan()を使用する場合があります:編集2

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

を:実は、今、私はそれについて考えることを、私はあなたが本当にそれをすることができるかどうかわからない。前に書いたコードは、そのようなことをしますが、オブジェクトを使用せず、クラスを使用します(つまり、クラス内の特定の関数を呼び出しています)。オブジェクトでもうまくいくかもしれませんが、保証はできません。

+0

awesome! – qodeninja

+3

'can'はクラスと同じようにオブジェクト上で正常に動作します – ikegami

+0

もちろん、クラスの作成者とそのユーザーの間の暗黙の同意は、非APIメソッドの内部で調整するのではなく、データの供給者。言い換えれば、ユーザーに「何を作ろうか?ケーキ、彼は言う。ファイン。 「何を作る?」彼は言う。 make_MESSが存在すると仮定すると、ユーザが操作するための関数である方がよいでしょう。もしそうでなければ、プログラマー以外の誰かがオブジェクトの内部を操作しているからです。提示された単純なケースでは、それは無害なようです。しかし、ユーザーは物事を壊すために非常に創造的な方法を見つけることができます。 – DavidO

関連する問題