我可以在 Perl 中传递对象方法的代码引用吗?

U. *_*ndl 1 methods perl closures reference

在处理各种参数获取和设置的网络处理程序中,我大量使用闭包。我有一个子例程,它接收一个闭包,并使用返回时作为参数传递的闭包构建另一个闭包(听起来很复杂,但这就是我想要这样的原因)。现在我有一个情况,我必须传递两个非常相似的闭包,每个闭包使用相同的对象方法,但具有不同的参数(对象方法检查传递的参数数量)。

我的想法是不传递两个(或更多)类似的闭包,而是传递$meth_ref对对象方法的引用(该对象也传递给返回闭包的函数),以便函数可以使用代码引用来传递不同的参数。

不幸的是我没有找到这样做的语法。

代码草图:

sub closure_maker($$)
{
    my ($obj, $meth_ref) = @_;

    return sub (...) {
        $meth_ref->($obj);
        ...
        $meth_ref->($obj, ...);
    };
}

my @handlers = (closure_maker($obj1, ???), closure_maker($obj2, ???));
Run Code Online (Sandbox Code Playgroud)

我希望你能明白。

ike*_*ami 5

使用$obj->$method_name()

sub closure_maker($$)
{
    my ($obj, $method_name) = @_;

    return sub {
        $obj->$method_name();
        ...
        $obj->$method_name(...);
    };
}

my @handlers = map { closure_maker($_, "method_name") } $obj1, $obj2;
Run Code Online (Sandbox Code Playgroud)

您可以使用$obj->can来获取对该方法的引用。

sub closure_maker($$)
{
    my ($obj, $method_name) = @_;

    my $method_ref = $obj->can($method_name);

    return sub {
        $obj->$method_ref();
        ...
        $obj->$method_ref(...);
    };
}
Run Code Online (Sandbox Code Playgroud)