我正在尝试做这样的事情:

-源文件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添加“祝福”

我尝试了一些在stackoverflow中发现的建议:
my $enqueueRef = $queue->can('enqueue');
MyModules::populateQueue(\&enqueueRef); <--- fails in the package at line

$ enqueue->($ item)带有未定义的子例程
MyModules::populateQueue(\&queue->enqueue) <-- same failure as above

任何想法如何将对象的方法作为参数传递给可以在函数中使用的函数?

最佳答案

Perl没有绑定方法引用的概念。如果存在,my $enqueue = $object->can('method')会将代码引用返回给方法,但是该代码引用未绑定到该特定对象-您仍然需要将其作为第一个参数($queue->$enqueue($item)$enqueue->($queue, $item))传递。

要传递绑定的方法,正确的解决方案是使用包装方法调用的匿名子:

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

10-05 18:30