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

dmo*_*ark 9 ruby oop monkeypatching

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

class String
  def do_magic
    ...magic...
  end
end
Run Code Online (Sandbox Code Playgroud)

我记得有一种使用String.send的方法.但我不记得它是如何完成的,也不记得我在哪里阅读它.任何人都可以指出任何仍然可以使该方法可用于String类和子对象的替代方法吗?

Chu*_*uck 15

执行此操作的任何其他方式只是猴子修补的更尴尬的语法.有各种方式涉及sendeval各种各样的事情,但为什么呢?继续以明显的方式做到这一点.

你想要在大型项目中或者当你有依赖关系时要小心猴子修补,因为当几只手在同一个地方乱搞时你可以结束冲突.这并不意味着寻找可以完成同样事情的替代语法 - 这意味着当您进行可能影响不属于您的代码的更改时要小心.在您的特定情况下,这可能不是一个问题.这只是大型项目中可能需要解决的问题.

Ruby中的一个替代方案是您可以向单个对象添加方法.

a = "Hello"
b = "Goodbye"
class <<a
  def to_slang
    "yo"
  end
end
a.to_slang # => "yo"
b.to_slang # NoMethodError: undefined method `to_slang' for "Goodbye":String
Run Code Online (Sandbox Code Playgroud)


Aar*_*nni 6

如果你想添加一个每个字符串对象都可以访问的新方法,那么按照你拥有它的方式去做就是如何完成它.

一个好的做法是将核心对象的扩展放在单独的文件(如string_ex.rb)或子目录(如extensionscore_ext)中.这样,很明显扩展了什么,并且很容易让人看到它们是如何被扩展或改变的.

猴子修补可能会变坏的地方是当您更改核心对象的某些现有行为时,会导致某些其他代码期望原始功能行为不当.