5

Mooseメソッドにブロックを渡すことは何とか可能ですか? 標準の Perl では、このようなプロトタイプで関数を定義できます。

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

sub次に、明示的な参照なしで関数にブロックを渡しfn { say "Hi there, world" }ます。

これは、サブルーチンが最初のパラメーターである場合にのみ可能であると思います。これは常に$selfMooseメソッドを使用するため、そこでは可能ではないようで、もう少し明示的な方法で行う必要があります:

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

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

これは、いくつかのブロックをラップする非常に便利な方法です。つまり、追加のテキストを提供したり、条件付きでコードを実行したり、エラー処理が同じままであるコードの周りに eval をラップしたりします (たとえば、いくつかのコードを評価してエラーを記録し、ユーザーを記録するなど)。 )。

私が何かを見逃していない場合、回線ノイズが多すぎずにこのようなことを達成するための半便利な回避策または代替方法はありますか?

4

1 に答える 1

4

メソッド呼び出しの後に ブロックを配置できるようにPerlX::MethodCallWithBlock(モジュールを介して) Perl 構文をゆがめる CPAN モジュールを見てください。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 に答える