La pregunta "How can I monkey-patch an instance method in Perl?" me hizo pensar. ¿Puedo redefinir dinámicamente los métodos de Perl? Decir que tengo una clase como ésta:¿Cómo puedo redefinir los métodos de clase Perl?
package MyClass;
sub new {
my $class = shift;
my $val = shift;
my $self = { val=> $val};
bless($self, $class);
return $self;
};
sub get_val {
my $self = shift;
return $self->{val}+10;
}
1;
Y digamos que la adición de dos números es muy caro.
Me gustaría modificar la clase para que $ val + 10 solo se calcule la primera vez que llamo al método en ese objeto. Las llamadas posteriores al método devolverían un valor en caché.
podría fácilmente modificar el método para incluir el almacenamiento en caché, pero:
- Tengo un montón de métodos como éste.
- Prefiero no ensuciar este método.
Lo que realmente quiero hacer es especificar una lista de métodos que sé siempre devuelven el mismo valor para una instancia determinada. Luego quiero tomar esta lista y pasarla a una función para agregar soporte de caché a esos métodos
¿Existe alguna forma efectiva de lograr esto?
Seguimiento. El siguiente código funciona, pero como use strict no permite referencias por cadena, no estoy 100% donde quiero estar.
sub myfn {
printf("computing\n");
return 10;
}
sub cache_fn {
my $fnref = shift;
my $orig = $fnref;
my $cacheval;
return sub {
if (defined($cacheval)) { return $cacheval; }
$cacheval = &$orig();
return $cacheval;
}
}
*{myfn} = cache_fn(\&myfn);
¿Cómo modifico simplemente hacer esto ?:
cache_fn(&myfn);
{no hay advertencias 'redefinir'; * myfn = cache_fn (\ &myfn);} - Esto elimina las advertencias ambiguas y redefinidas. Consulte mi nueva respuesta sobre cache_fn (&myfn); – draegtun
Es posible que desee examinar las memorias (hay algunos buenos módulos de CPAN) o usar desencadenantes de Moose para caché. cálculos en atributos y recalcularlos según sea necesario con desencadenadores. – Ether