【问题标题】:Does Perl monkey-patching allow you to see the patched package's scope?Perl 猴子补丁是否允许您查看补丁包的范围?
【发布时间】:2009-01-23 21:56:38
【问题描述】:

我正在使用"How can I monkey-patch an instance method in Perl?" 开头给出的技术修补程序包。我遇到的问题是原始子例程使用了包级别的my 变量,修补后的子例程似乎无法通过完整路径规范或隐式使用访问该变量。

有什么方法可以获取以这种方式限定的数据,以便在修补的子例程中使用?

【问题讨论】:

  • 如果它被定义为全局而不是词法。

标签: perl scope packages monkeypatching


【解决方案1】:

您可以使用PadWalker 模块获取词汇。邪恶,但它有效。

【讨论】:

  • 哇,这很有趣。肮脏,但很有趣。
【解决方案2】:

没有。您误会的是它们不是包范围。根据定义,词法变量仅限于其词法范围,即它所在的块。

【讨论】:

  • 啊,好点子——所以如果你不能修改原始源文件,除非某些方法返回它,否则你就是 SOL?
  • 没错。如果你在想,“为什么有两种不同的方式来细分命名空间——按包和词法范围?运行语言的方式真是太糟糕了!”,你也是对的。
  • 我不同意。两者的工作方式不同,用途也不同。词法是大多数问题的最佳解决方案,但在某些情况下动态范围更好。
  • @Leon:似乎(从这次磨合中)词汇违背了“绅士的隐私”的想法。我想获得这些价值观,并且必须破解解释器才能做到这一点。 :-(
  • 所有常见的编程语言都有词法范围是有原因的(我认为 emacs lisp 是最常见的例外)。如果使用不当(这很难),动态范围会导致严重的问题。有关该问题的更多信息,请在 Wikipedia 上查找动态范围。
【解决方案3】:

词法(即:用'my'声明)在声明它们的词法范围(文件或块)之外不可见。这就是词法变量的全部意义所在。

如果有一个子例程/方法与词法变量在同一范围内,那么它可以返回词法的值,并且可以允许从其范围之外间接访问该变量。

对于词法变量,没有“完整路径规范”之类的东西。那是针对包变量的。如果 var 是用 'our' 而不是 'my' 声明的,你可以这样做。

【讨论】:

    猜你喜欢
    • 2016-09-01
    • 2012-09-16
    • 2012-12-18
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多