当前位置:  开发笔记 > 编程语言 > 正文

如何重新定义Perl类方法?

如何解决《如何重新定义Perl类方法?》经验,为你挑选了2个好方法。

问题"如何在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);

innaM.. 16

您可以从另一个包中覆盖get_val等方法,如下所示:

*{MyClass::get_val} = sub { return $some_cached_value };

如果您有方法名称列表,则可以执行以下操作:

my @methods = qw/ foo bar get_val /;
foreach my $meth ( @methods ) {
    my $method_name = 'MyClass::' . $meth;
    no strict 'refs';
    *{$method_name} = sub { return $some_cached_value };
}

那是你的想象吗?



1> innaM..:

您可以从另一个包中覆盖get_val等方法,如下所示:

*{MyClass::get_val} = sub { return $some_cached_value };

如果您有方法名称列表,则可以执行以下操作:

my @methods = qw/ foo bar get_val /;
foreach my $meth ( @methods ) {
    my $method_name = 'MyClass::' . $meth;
    no strict 'refs';
    *{$method_name} = sub { return $some_cached_value };
}

那是你的想象吗?



2> brian d foy..:

我在Mastering Perl的"动态子程序"一章中写了几个你可能想要做的不同的事情.根据您正在做的事情,您可能希望包装子例程,或重新定义它,子类或其他各种事物.

Perl是一种动态语言,所以你可以做很多黑魔法.明智地使用它是诀窍.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有