2017-11-02 10 views
1

機能するようにパラメータとしてオブジェクトメソッドの参照を渡す:perlのは、私がこのような何かをしようとしている

- ソースファイル1

my $queue = Thread::Queue->new(); 
MyModules::populateQueue(<pass $queue->enqueue method reference); 
... 

- パッケージファイル

package MyModules 

sub populateQueue { 
    my $enqueue = $_[0]; 
    my $item = <find item to add to queue>; 
    $enqueue->($item); 

。 ..

最初に、私はThread :: Queueに "bless"を追加できません

どのようにする方法を渡すために

MyModules::populateQueue(\&queue->enqueue) <-- same failure as above 

任意のアイデア、未定義のサブルーチンで>($アイテム) -

my $enqueueRef = $queue->can('enqueue'); 
MyModules::populateQueue(\&enqueueRef); <--- fails in the package at line 

$エンキュー:

は、私はstackoverflowので見つかった提案のカップルを試してみましたその関数で使用できる関数へのパラメータとしてのオブジェクト?

+2

:バインドされたメソッドを渡すために

、正解は、メソッド呼び出しをラップ匿名サブ使用することである 'サブ{$ queue->エンキューを。 } ' –

+0

CPANには' curry'モジュールもあります。 – simbabque

答えて

5

Perlにはバインドされたメソッド参照の概念がありません。 my $enqueue = $object->can('method')は、コードrefが存在すればそれを返しますが、コードrefはその特定のオブジェクトにバインドされていません。それでも最初の引数($queue->$enqueue($item)または$enqueue->($queue, $item))として渡す必要があります。ただ、サブのまわりでそれを包む

populate_queue(sub { $queue->enqueue(@_) }); 
+0

私はMyModulesパッケージで次のようにしました。 MyModules :: populateQueue(sub {$ queue-> enqueue(@_)}); が動作します。 – schleprock