Вопрос «Как я могу исправить патч метода экземпляра в 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 вычислялся только при первом вызове метода для этого объекта. Последующие вызовы метода вернут кэшированное значение.
Я мог бы легко изменить метод для включения кэширования, но:
- У меня есть несколько таких методов.
- Я бы лучше не испортил этот метод.
Что я действительно хочу сделать, это указать список методов, которые, как я знаю, всегда возвращают одно и то же значение для данного экземпляра. Затем я хочу взять этот список и передать его функции, чтобы добавить поддержку кэширования для этих методов
Есть ли эффективный способ сделать это?
Продолжайте. Приведенный ниже код работает, но поскольку использование 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);