根据Wikipedia, 猴子补丁 为:

一方式来扩展或者修改运行时 代码的动态语言[...] 没有改变原来源 代码。

以下语句来自同一项困惑我

在红宝石的术语猴子补丁 被误解为意味着任何动态 修改一类和是经常 作为同义词用动态 修改任何类在运行时间。

我想知道 的确切含义的猴子修补在红宝石。 是,它做的事情如下,或者是其他什么东西?

class String
  def foo
    "foo"
  end
end
有帮助吗?

解决方案

在简短的回答是,没有“确切”的意思,因为它是一个新的术语,不同的人不同的方式使用它。说得多,至少可以从维基百科的文章可以看出端倪。还有一些谁坚持认为它仅适用于“运行”代码(内置类,我想),而有些人会用它来指代任何类的运行时修改。

就个人而言,我更喜欢更包容性的定义。毕竟,如果我们使用仅内置类的修改期限,如何将我们指的是所有其他类的运行时修改?对我来说最重要的事情是,有源代码和实际运行的类之间的差异。

  

在红宝石,术语猴补丁是   误解为是指任何动态   修饰一类和常常是   用作动态的同义词   在运行时修改任何类

上面的声明称,Ruby的使用是不正确 - 但条件演变,这并不总是一件坏事。

其他提示

最好的解释,我听到 猴子修补/鸭子-冲 是帕特里克*尤因在 RailsConf2007年

...如果它走路像鸭,并说话像一只鸭子,一只鸭子,对吗?所以 如果这鸭子不是给你的噪声,你想要的,你已经有了 刚刚是不是打了,鸭子,直到返回你的期望。

猴修补是当您替换是在运行时类的方法(添加新方法如其他人所描述的)。

在除了是一个非常不明显,难以调试方式改变码,它不按比例的;随着越来越多的模块启动猴修补方法,变化跺脚彼此成长的可能性。

您是正确的;当修改或扩展现有的类,而不是继承它是

这是猴修补:

class Float
  def self.times(&block)
    self.to_i.times { |i| yield(i) }
    remainder = self - self.to_i
    yield(remainder) if remainder > 0.0
  end
end

现在,我想这可能是有用的时候,但是想象一下,如果你看到的程序。

def my_method(my_special_number)
  sum = 0
  my_special_number.times { |num| sum << some_val ** num }
  sum
end

和它只是打破的偶尔的,当它被调用。对于那些关注你已经知道为什么,但是想象一下,你不知道有.times类方法的浮点类型,并自动假定my_special_number是一个整数。每次参数是一个整数,整数或浮点数,它会正常工作(全整数传回除非有一个浮点余数)。但在小数区通过一些与任何东西,它会打破肯定!

试想多久,这可能与你的宝石发生,Rails插件,甚至被自己的同事在你的项目。如果有在有一个或两个小方法,这样,它可能需要一些时间来发现并纠正。

结果

如果你想知道为什么它打破,注意sum是一个整数和浮点余可被传递;此外,当类型相同指数符号才起作用。所以,你可能会认为这是固定的,因为你懒得转换到数字花车......才发现,总和不能采取浮点结果。

在Python中的monkeypatching被称为很多作为尴尬的标志:“我不得不猴补丁这个类,因为...”(我遇到它首先与Zope的,文中提到该问题时)。它被用来说,它采取上游类的保持和在运行时,而不是游说修复它以固定在实际的类或它们在子类固定不必要的行为是必要的。在我的经验,红宝石的人不谈论的Monkeypatching那么多,因为它没有考虑特别糟糕,甚至值得一提的(因此“鸭子冲”)。很明显,你必须要小心有关更改将在其他依赖使用的方法的返回值,但添加方法一类active_support和面做的是完全安全的方式。

更新10年后:我将修订的最后一句说“是比较安全的。”扩大与新方法的核心库类可能会导致问题,如果别人得到了同样的想法,并用不同的实现或方法签名添加相同的方法,或者如果人混淆为核心的语言功能扩展的方法。这两种情况下经常发生在红宝石(特别是关于active_support方法)。

一般是指约自组织的变化,使用Ruby公开课,经常与低质量码。

在受试者良好后续:

http://www.infoq.com/articles/ruby-open - 班-的Monkeypatching

的概念的无代码说明:

的确切概念的讨论是waaaay太学术和细微比它需要的。让我们保持简单用下面的例子:

的汽车中的正常操作

你如何正常启动车吗?原因很简单:你把点火开关,汽车启动,瞧你去比赛

猴修补一个车载

但是,如果别人提出的汽车,如果你想改变它如何运作的呢?

您不需要去汽车制造厂做出这些变化:你可以简单地“猴子补丁”吧,由发动机罩下获取和surreptiously和鬼祟重新布线的东西,在这里和那里增加了一些incideniaries。你要真知道自己在做什么,当你做到这一点,否则结果可能是颇具爆发力 - 也许这正是你想要什么?

  

Fabrizzio,你要去哪里?的”

轰!

  

“让你的源代码接近,但你的猴子补丁近了。”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top