Вопрос "Как обезьяно исправить метод экземпляра в Perl? " заставили меня задуматься. Могу ли я динамически переопределять методы 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;
Допустим, сложение двух чисел действительно дорого.
Я хотел бы изменить класс так, чтобы $ val + 10 вычислялось только при первом вызове метода для этого объекта. Последующие вызовы метода вернут кешированное значение.
Я мог бы легко изменить метод, включив кеширование, но:
- У меня есть несколько таких методов.
- Я бы предпочел не испачкать этот метод.
Что я действительно хочу сделать, так это указать список методов, которые, как я знаю, всегда возвращают одно и то же значение для данного экземпляра. Затем я хочу взять этот список и передать его функции, чтобы добавить к этим методам поддержку кеширования.
Есть ли эффективный способ добиться этого?
Следовать за. Приведенный ниже код работает, но поскольку use strict не допускает ссылок по строке, я не на 100% там, где хочу быть.
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);
Как мне изменить, чтобы просто сделать это ?:
cache_fn(&myfn);