问题标签 [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 投票
6 回答
2621 浏览

ruby - 猴子修补核心类的替代方案

我对 Ruby 还是很陌生,基本上只是在完成 Cooper 的书之后才编写我的第一个微程序。我被指出了避免猴子修补的方向,但问题是我不知道实现相同行为的替代方法是什么。基本上,我想添加一个每个字符串对象都可以访问的新方法。显而易见的猴子修补方法是:

我记得有一种使用 String.send 的方法。但我不记得它是如何完成的,也不记得我在哪里读到的。谁能指出仍然让我将该方法用于 String 类和子对象的任何替代方法?

0 投票
4 回答
445 浏览

language-agnostic - 寻找猴子修补有什么问题的具体示例?

我听说过很多关于猴子补丁如何如此酷或者猴子补丁是地球上最糟糕的事情的声音。我的想法是,如果您编写一些代码然后其他人更改其功能以执行其他操作,这并不好。但我正在寻找一个具体的例子来说明这可能会真正伤害到你。我的意思是,我一直在编写代码,然后我的同事对其进行更改。那么,monkey patching 与此有何不同?可能发生的最坏情况是什么?

0 投票
8 回答
2594 浏览

python - 如果 Ruby 和 Python 都允许猴子补丁,为什么在 Ruby 中更有争议?

在我听到的许多关于 Ruby 的讨论中,人们表达了他们对该语言的保留意见,猴子修补问题成为他们主要关注的问题之一。

然而,我很少听到在 Python 上下文中提出的相同论点,尽管 Python 语言也允许这样做。

为什么会有这种区别?

Python 是否包含不同类型的保护措施以最大程度地降低此功能的风险?

0 投票
2 回答
5905 浏览

ruby - ruby中的fixnum和素数

在我开始自己写这篇文章之前,有没有人看过以下行为的 ruby​​ 实现?

显然,这种事情对于大数来说是丑陋的,但对于从不超过几千的整数(对我来说是常见的例子),一个明智的实现是可行的,因此是个问题。

0 投票
9 回答
3435 浏览

java - 有没有办法从类外部修改 Java 中的“private static final”字段的值?

我知道这通常很愚蠢,但在阅读问题之前不要开枪。我保证我有充分的理由需要这样做:)

可以使用反射修改 Java 中的常规私有字段,但是 Java 在尝试对final字段执行相同操作时会引发安全异常。

我假设这是严格执行的,但我想无论如何我都会问,以防万一有人想出了一个黑客来做到这一点。

假设我有一个带有类“ SomeClass”的外部库

我本质上想对 SomeClass 进行猴子补丁,以便我可以执行我自己的doSomething(). 由于(据我所知)没有任何方法可以在 java 中真正做到这一点,因此我唯一的解决方案是更改 的值,INSTANCE以便它使用修改后的方法返回我的类版本。

本质上,我只想用安全检查包装调用,然后调用原始方法。

外部库总是用来getInstance()获取这个类的一个实例(即它是一个单例)。

编辑:只是为了澄清,getInstance()是由外部库调用的,而不是我的代码,所以只是子类化并不能解决问题。

如果我不能这样做,我能想到的唯一其他解决方案是复制粘贴整个类并修改方法。这并不理想,因为我必须让我的 fork 与库的更改保持同步。如果有人有一些更易于维护的东西,我愿意接受建议。

0 投票
2 回答
1145 浏览

.net - PowerShell、扩展方法和猴子补丁

是否可以在 PowerShell 中编写扩展方法?或者在运行时在现有类型(如 [string] )之上添加一个新方法?

0 投票
1 回答
1849 浏览

python - 在 Django 中,如何更改 User 类以使用不同的数据库表?

我们正在与现有应用程序一起运行 django - 并与 - 共享数据库。我们想使用现有的“用户”表(不是 Django 自己的)来存储用户信息。

看起来可以在用户定义的 Meta 类中更改 Django 使用的表的名称。

但我们不希望改变 Django 核心本身。

所以我们认为我们可以像这样子类化核心 auth.User 类:

这里的目的不是向自定义的 User 类添加任何额外的字段。但只是为了使用替代表。

但是,这失败了(可能是因为 ORM 假设 our_user_table 应该有一个外键引用原始 User 表,但它没有)。

那么,这是做我们想做的事的明智方式吗?我是否错过了一些将类映射到表格的更简单方法?或者,如果没有,可以使它起作用吗?

更新 :

我想我可以通过在 local_settings.py 中“猴子修补”用户的 _meta 来做出我想要的改变

谁能想到如果我这样做会发生什么不好的事情?(特别是在相当典型的 Django / Pinax 应用程序的上下文中?)

0 投票
3 回答
458 浏览

ruby - 你如何在 Ruby 中做一个安全的、向后兼容的“reverse-monkeypatch”?

如果您的同事在 Ruby 中“打开”(“monkeypatches”)一个类并重新定义了一些您需要使用的重要功能,您如何访问原始的预猴子补丁功能而不破坏已经依赖/依赖于他的猴子补丁定义的系统?

0 投票
2 回答
267 浏览

ruby - 你如何影响 Ruby 代码的加载顺序?

假设您的同事猴子修补了 Fixnum 类并重新定义了 + 方法以减去而不是添加:

您的问题是您想访问 + 方法的原始功能。所以你把这段代码放在他之前的同一个源文件中。在他对其进行猴子补丁之前,它会将+ 方法别名为“original_plus” 。

现在您可以通过 original_plus 访问 + 方法的原始功能

但我需要知道的是:

除了将其粘贴到他修改的同一源文件中之外,还有其他方法可以在加载他的猴子补丁之前加载此别名吗?

我的问题有两个原因:

  1. 我可能不想让他知道我已经这样做了
  2. 如果源文件被更改,使得别名最终低于猴子补丁,则别名将不再产生所需的结果。
0 投票
5 回答
570 浏览

ruby - Smalltalk 如何处理猴子补丁?

我是一名 Ruby 程序员。对我来说,monkeypatching 是在运行时更改外部项目中的类或模块方法。我感兴趣的是,您有什么机制可以保护您免受某些对该功能的滥用。接下来是我遇到的一些场景,monkeypatching 咬了我一口。

虽然我根本不了解 Smalltalk,但这种语言早在 Ruby 之前就已经存在了。我做了一些研究,看看 Smalltalk 是否以及如何解决其中的一些问题,但在 Google 上没有找到太多。所以我在这里,询问 Smalltalkers 是否可以分享他们的智慧。

场景 A:错误修复冲突

项目 A 和 B 依赖于项目 C。项目 C 有一个错误。项目 A 和 B 版本包含对项目 C 的修复。

如果你的代码使用项目 A 和 B,你怎么知道补丁不会冲突?

场景 B:过时的错误修复

项目 C 发布了他们项目的固定次要版本。

如果您加载项目 A,是否仍会应用补丁,但可能会损坏?我很想知道是否存在某种机制,例如,如果代码已修复,则不加载补丁。

场景 C:冲突的扩展

项目 A 和 B 使用项目 C 的类 Foo。两者都向 Foo 添加了一个实用方法,例如 #toDate。A 的 toDate 版本返回一个日期字符串,而 B 的一个返回 Date 对象。

如果您加载两个项目(使用 C dep),是否有一种机制可以警告/防止冲突?或者您是否必须等到运行时由于方法中的错误期望而引发错误?

关于问题更新

阅读答案,我意识到我的问题过于广泛和模糊。所以这里是它的重写版本。