Вопрос "Как я могу обезвредить метод экземпляра в 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);