5 votes

Passage d'un bloc à une méthode Moose

Est-il possible de passer des blocs aux méthodes Moose ? En Perl standard, je peux définir une fonction avec des prototypes comme ceci

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

et ensuite passer un bloc à la fonction sans explicite sub les références, c'est-à-dire fn { say "Hi there, world" } .

Je pense que cela n'est possible que si le sous-programme est le premier paramètre, et comme celui-ci est toujours $self avec une méthode Moose, cela ne semble pas possible ici, ce qui m'oblige à le faire de manière un peu plus explicite :

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

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

Ce serait une façon assez pratique d'envelopper certains blocs, c'est-à-dire de fournir du texte supplémentaire ou d'exécuter du code de façon conditionnelle ou d'envelopper une évaluation autour d'un code où la gestion des erreurs reste la même (par exemple, évaluer un code et enregistrer les erreurs, enregistrer l'utilisateur, etc.)

Si je n'ai pas raté quelque chose, existe-t-il une solution de contournement ou une méthode alternative pour obtenir ce résultat sans trop de bruit de ligne ?

4voto

draegtun Points 17081

Jetez un coup d'œil à la PerlX::MethodCallWithBlock module CPAN qui déforme la syntaxe Perl (via l'option Devel::Declare ) pour vous permettre de mettre un bloc après un appel de méthode.

Par exemple :

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

{
    package Foo;
    use Moose;

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

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

Ce module a été publié en tant que preuve de concept . Jusqu'à présent, je n'ai pas eu de problèmes avec ce produit, mais c'est une question de jugement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X