是否可以通过某种方式将 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/