Est-il possible d'utiliser multidispatch pour la méthode de stockage lorsque l'on utilise un proxy ? Dans l'exemple minimal suivant, le code est appelé lors du stockage d'un fichier Int
my $foo := do {
my $bar = 1;
Proxy.new:
:FETCH( method { return $bar} ),
:STORE( method (Int $i) { $bar = $i } )
}
say $foo; # 1
$foo = 2;
say $foo; # 2
$foo = "3"; # error, need to pass an Int
Mais j'aimerais m'occuper de la STORE
différemment si on leur donne, par exemple, un Str
. Le contournement que j'ai trouvé (autre que de faire une méthode méga avec given
/ where
est de créer un multi sub
à l'intérieur d'un bloc, et retourner le sous (parce qu'un multi method
ne peuvent pas être mentionnés avec &foo
) avec un premier paramètre fictif :
my $foo := do {
my $bar = 1;
Proxy.new:
:FETCH( method { return $bar} ),
:STORE(
do {
multi sub xyzzy ($, Int $i) { $bar = $i }
multi sub xyzzy ($, Str $i) { $bar = +$i + 1}
&xyzzy
}
)
}
say $foo; # 1
$foo = 2;
say $foo; # 2
$foo = "3";
say $foo; # 4
Existe-t-il un meilleur moyen de procéder (principalement pour la clarté du code en utilisant method
parce que sub
semble... trompeur) ?