将块传递给Moose方法

时间:2012-10-11 11:34:17

标签: perl moose

以某种方式可以将块传递给Moose方法吗?在标准的Perl中,我可以用这样的原型定义一个函数

sub fn (&) {
    my $code =\&{shift @_};
    $code->();
}

然后将一个块传递给函数而没有明确的sub引用,即fn { say "Hi there, world" }

我认为这只有在子程序是第一个参数的情况下才有可能,因为这总是$self使用Moose方法,它似乎不可能存在,迫使我以稍微更明确的方式去做:

sub wrapper {
    my ($self, $code) = @_;
    $code->()
}

Wrapper->wrapper(sub { say "Hi there, world" });

现在这将是一个非常方便的方法来包装一些块,即提供一些额外的文本或有条件地执行代码或围绕某些代码包装eval,其中错误处理保持不变(例如,eval一些代码和日志错误,记录用户等。)。

如果我没有遗漏某些东西,是否有一些半便捷的解决方法或替代方法来实现这样的事情而没有太多的线路噪音?

1 个答案:

答案 0 :(得分:4)

查看PerlX::MethodCallWithBlock CPAN模块,该模块使用Perl语法(通过Devel::Declare模块),以允许您在方法调用后放置

例如:

use 5.016;
use warnings;
use PerlX::MethodCallWithBlock;

{
    package Foo;
    use Moose;

    sub bar {
        my ($self, $code) = @_;
        $code->();
    }
}

Foo->bar { say "Hi there world" };

该模块作为概念证明发布。到目前为止,我对YMMV没有任何问题。