0

スレッドに問題があります。サブルーチンとしてクラス インスタンス メソッドを使用してスレッドを作成すると、エラーが発生し続けます。method 変数と params 変数は他のものに基づいて設定されるため、この方法でクラス インスタンス メソッドを呼び出す必要があります。スレッドがなくても、問題なく動作します。スレッドの作成にそれを指定する正しい方法がわかりません:

my $instance = someclass->new();
my $method = 'get';
my $params = { 'abc' => 123 };
my $thread = threads->create($instance->$method,$params);

これにより、「コード参照ではありません」というエラーが表示されます。これは実際にメソッドを呼び出し、戻り値を引数として使用している可能性があると思います。さて、これを試しました:

my $thread = threads->create(\&{$instance->$method},$params);

これにより、「サブルーチン参照ではありません」というエラーが表示されます。これについて何か助けていただければ幸いです。

4

2 に答える 2

4
my $thread = threads->create(sub { $instance->$method(@_) }, $params);

または、インスタンスとメソッドを最初の引数にも渡すことができます。

package SomeClass;

sub new {
    my $class = shift;
    bless { args => [ @_ ] };
}

sub get {
    my $self = shift;
    my $args = shift;
    return join(" ", @{ $self->{args} }, $args->{abc});
}

package main;

use 5.012;
use threads;

my $x = SomeClass->new("An instance");

threads->create(sub { say $x->get(@_) }, {'abc' => 123 })->join;

threads->create(
    sub {
        my $instance = shift;
        my $method = shift;
        say $instance->$method(@_);
    }, $x, 'get', { 'abc' => 123 }
)->join;

実際、 で閉じないようにするために、私は後者を好み$instanceます。

于 2013-04-11T18:54:02.253 に答える
1

括弧なしでメソッドを呼び出すことは、引数なしでメソッドを呼び出すことと同じです。

$foo->bar eq $foo->bar()

コードリファレンスを作成するには、メソッド呼び出しをラップするラムダを指定できます。

threads->create(sub{ $instance->get($params) })

(Sinan Ünürsの回答を参照)、またはユニバーサルcan関数を使用できます。

メソッドは、メソッドが呼び出された場合に解決されるのcanと同じ方法でメソッドを解決し、見つかった場合はそのメソッドの coderef を返すか、 を返しますundef。これにより、ブール値テストとして使用できるようになります。

メソッドは、最初の引数が呼び出し元 (オブジェクト) である単なるサブルーチンであることに注意してください。

my $code = $instance->can($method) or die "Can't resolve $method";
threads->create($code, $instance, $params);

ただしcanAUTOLOAD.

于 2013-04-11T19:04:08.033 に答える