perl - 将 block 传递给 Moose 方法

标签 perl moose

是否可以通过某种方式将 block 传递给 Moose 方法?在标准 Perl 中,我可以用这样的原型(prototype)定义一个函数

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

然后将一个 block 传递给没有显式 sub 引用的函数,即 fn { say "Hi There, world"}

我认为这只有在子例程是第一个参数的情况下才有可能,并且由于这始终是带有 Moose 方法的 $self ,因此这似乎不可能,迫使我这样做稍微更明确的方式:

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

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

现在,这将是包装一些 block 的一种非常方便的方法,即提供一些附加文本或有条件地执行代码,或在错误处理保持不变的情况下对某些代码进行评估(例如,评估一些代码并记录错误,记录用户等)。

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

最佳答案

看看 PerlX::MethodCallWithBlock CPAN 模块扭曲 Perl 语法(通过 Devel::Declare 模块)以允许您在方法调用后放置一个 block

例如:

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 之外,我还没有遇到任何问题。

关于perl - 将 block 传递给 Moose 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12838578/

相关文章:

perl - 我可以在构造时设置 Moose 对象属性的 'isa' 吗?

linux - Perl 无法设置语言环境,即使它已安装

Perl UTF8 编码错误。 LWP::UserAgent->decoded_content 或 Encode::decode 都不起作用。其他想法?

Perl 搜索和替换目录中所有文件的脚本

Perl - 将代码块作为括号内的参数传递

perl - 如何使用 hypnotoad 或 morbo 调用交互式 Perl 调试?

perl - MooseX::Declare 如何从属性默认方法返回 ArrayRef?

子类中的 perl moose 触发器破坏方法修饰符

perl - 我可以订购作为特征一部分加载的方法修饰符吗?

perl - 为什么在使用 Moose 时覆盖 new 是 "very bad practice"?