5

是否有可能将块传递给 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 一些代码和日志错误,记录用户等)。 )。

如果我没有遗漏任何东西,是否有一些半方便的解决方法或替代方法可以在没有太多线路噪音的情况下实现这样的目标?

4

1 回答 1

4

看看PerlX::MethodCallWithBlockCPAN 模块,它扭曲了 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 之外,我还没有遇到任何问题。

于 2012-10-11T15:39:35.797 回答