gpt4 book ai didi

perl - 如何在 Perl 中访问monkeypatched 方法的原始方法?

转载 作者:行者123 更新时间:2023-12-03 18:10:20 25 4
gpt4 key购买 nike

我正在尝试 monkey patch Perl 类:我想更改现有方法的行为。

This node on perlmonks显示如何向现有类添加函数。我发现这个模式也可以用来为现有的函数提供一个新的实现。

但是,我想知道如何调用原始函数。

我正在寻找这样的东西:

use ExistingClass;

# TODO: Somehow rename existingFunction() to oldExistingFunction().

sub ExistingClass::existingFunction {
my $self = shift;

# New behavior goes here.
$self->oldExistingFunction(@_); # Call old behavior.
# More new behavior here.
}

最佳答案

Typeglob 赋值

*ExistingClass::oldExistingFunction = *ExistingClass::existingFunction;

又快又脏。这是所有 existingFunction 的别名符号到 oldExistingFunction .这包括您感兴趣的 sub,以及可能碰巧具有相同名称的任何标量、数组、散列、句柄。
  • 优点:不用思考,就是有效。 “快”
  • 缺点:“脏”

  • 代码引用分配
    *ExistingClass::oldExistingFunction = \&ExistingClass::existingFunction;
    # or something using *ExistingClass::symbol{CODE}

    那个只是给 sub 取别名。它仍然在包存储中完成,所以 oldExistingFunction符号是全局可见的,这可能是您想要的,也可能不是。可能不是。
  • 优点:别名不会“泄漏”到其他变量类型。
  • 缺点:多思考,多打字。如果使用 *...{CODE} 语法,则需要更多思考(我个人不会每天都使用它)

  • 词法编码引用
    my $oldFunction = \&ExistingClass::existingFunction;

    使用 my保留对仅对当前块/文件可见的旧函数的引用。如果没有您的帮助,外部代码将无法获得它。注意调用约定:
    $self->$oldFunction(@args);
    $oldFunction->($self, @args);
  • 优点:不再有可见性问题
  • 缺点:更难做对

  • 驼鹿

    jrockway's answer .它必须是正确的方式,因为不再需要使用 globs 和/或引用,但我对它的了解不足以解释它。

    关于perl - 如何在 Perl 中访问monkeypatched 方法的原始方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/575710/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com