问题标签 [monkeypatching]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
8923 浏览

java - 是否可以在 Java 中进行猴子补丁?

如果可能的话,我不想讨论这种方法的优点。我相信答案是“不”。但也许有人会让我大吃一惊!

想象一下,您有一个核心小部件类。它有一个方法calculateHeight(),它返回一个高度。高度太大 - 这导致按钮(比如说)太大。您可以扩展 DefaultWidget 以创建您自己的 NiceWidget,并实现您自己的calculateHeight()以返回更好的尺寸。

现在是一个库类 WindowDisplayFactory,以相当复杂的方法实例化 DefaultWidget。您希望它使用您的 NiceWidget。工厂类的方法如下所示:

就是这样。结果使 DefaultWidget 深入到其他对象的层次结构中。问题 - 如何让这个工厂方法使用我自己的 NiceWidget?或者至少让我自己calculateHeight()的。理想情况下,我希望能够修补 DefaultWidget 以便它的 calculateHeight 做正确的事情......

这就是我可以在 Python、Ruby 等中做的事情。setMethod()不过,我已经发明了这个名字。对我开放的其他选择是:

  • 将方法的代码复制粘贴createView()到我自己的继承自工厂类的类中
  • 与太大的小部件一起生活

工厂类无法更改 - 它是核心平台 API 的一部分。我尝试对返回的结果进行反射以获取(最终)添加的小部件,但它向下有几个小部件层,并且在某个地方它被用来初始化其他东西,导致奇怪的副作用。

有任何想法吗?到目前为止,我的解决方案是复制粘贴工作,但这是一个需要在升级到更新版本的平台时跟踪父工厂类中的更改的警察,我很想听听其他选项。

0 投票
8 回答
39908 浏览

ruby - Ruby 中的“猴子补丁”到底是什么意思?

根据维基百科,猴子补丁是:

一种在不改变原始源代码的情况下扩展或修改动态语言的运行时代码的方法 [...]。

同一条目中的以下语句使我感到困惑:

在 Ruby 中,monkey patch 一词被误解为对类的任何动态修改,并且通常用作在运行时动态修改任何类的同义词。

我想知道Ruby 中猴子补丁的确切含义。它是在做类似以下的事情,还是做其他事情?

0 投票
3 回答
545 浏览

ruby-on-rails - [] Ruby 字符串的方法

当我阅读 Beast 的源代码时,我发现很多这样的代码:

对我来说,这似乎是对 [] 方法的调用,其中 Symbol 作为 String 的输入参数,但我在 ruby​​ API 中没有找到 String [] 方法的这种类型的参数。这是什么意思?提前致谢。

0 投票
4 回答
2370 浏览

oop - 猴子补丁还是不猴子?

这是一个更普遍的问题,然后是特定于语言的问题,尽管我在玩 python ncurses 模块时遇到了这个问题。我需要显示语言环境字符并将它们识别为字符,所以我只是快速地从 curses 模块中修补了一些函数/方法。

这就是我所说的快速而丑陋的解决方案,即使它有效。而且变化相对较小,所以我希望我没有搞砸任何事情。我的计划是找到另一个解决方案,但是看到它运行良好并且运行良好,你知道它是怎么回事,我继续处理我必须处理的其他问题,我确定如果没有错误,我永远不会让它变得更好。

不过,在我看来,更普遍的问题是——显然有些语言允许我们在类中对大块代码进行猴子补丁。如果这是我自己用的代码,或者改动很小,没关系。如果其他开发人员使用我的代码怎么办,他看到我使用了一些众所周知的模块,所以他可以假设它像以前一样工作。然后,这种方法突然表现得与它应该的不同。

所以,非常主观,我们应该使用猴子补丁,如果是,何时以及如何?我们应该如何记录它?


编辑:对于@guerda:

Monkey-patching 是在执行时动态改变某些代码的行为,而不改变代码本身的能力。

Python中的一个小例子:

0 投票
4 回答
425 浏览

python - 无需猴子补丁即可将 Django 用户与 Google Apps 同步

我正在编写一个 Django 应用程序,并且我希望在本地创建帐户时使用 Provisioning API 在我们的 Google Apps 托管电子邮件上创建一个帐户。

我只会使用信号,但由于我希望跨站点同步密码,所以我已经做了猴子补丁User.objects.create_userUser.set_password使用包装器来分别创建 Google 帐户和更新密码。

Monkeypatching 似乎不受欢迎,所以我想知道,有没有更好的方法来做到这一点?

0 投票
8 回答
5960 浏览

perl - 如何在 Perl 中对实例方法进行猴子修补?

我正在尝试猴子补丁(鸭拳:-)一个LWP::UserAgent实例,如下所示:

这不是正确的语法——它产生:

无法修改 [module] 行 [lineno] 处的非左值子例程调用。

我记得(来自Programming Perl),调度查找是基于祝福包(ref($agent)我相信)动态执行的,所以我不确定实例猴子补丁如何在不影响祝福包的情况下工作。

我知道我可以子类化UserAgent,但我更喜欢更简洁的猴子补丁方法。同意的成年人和你有什么。;-)

0 投票
3 回答
529 浏览

perl - Perl 猴子补丁是否允许您查看补丁包的范围?

我正在使用“如何在 Perl 中对实例方法进行猴子修补?”开头给出的技术对包进行修补。. 我遇到的问题是原始子例程使用了一个包级my变量,修补后的子例程似乎无法通过完整路径规范或隐式使用访问该变量。

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

0 投票
6 回答
7969 浏览

php - 是否可以替换(monkeypatch)PHP 函数?

您可以在 Python 中执行此操作,但在 PHP 中可以吗?

例如:

0 投票
2 回答
541 浏览

oop - 猴子修补/重新开放真的是反思的一个例子吗?

为这个问题的递归性质道歉,但对 SO 问题的选择答案让我质疑我对反射的理解。

我认为反射主要是关于在程序运行时查询程序的内部事件。此响应中给出的示例修补了 Ruby 的内置 Integer 类。

  • 这不是更像函数重载/继承而不是运行时修改吗?
  • 重新开课真的是反思的一个例子吗?
0 投票
7 回答
671 浏览

perl - 如何在 Perl 中访问猴子补丁方法的原始方法?

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

perlmonks 上的这个节点显示了如何函数添加到现有类。我发现这种模式也可以用来为现有功能提供新的实现。

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

我正在寻找这样的东西: