从重新定义的方法调用原始方法

Dan*_*ner 3 ruby monkeypatching

我的问题基于主题 \xe2\x80\x9credefining a single ruby​​ method on a single instance with a lambda\xe2\x80\x9d 的答案

\n\n

如何重新定义方法并在新方法中调用原始定义?some_object\ 类的其他实例不应受到影响。

\n\n
def some_object.some_method\n  # call original `some_object.some_method` here\n  do_something_else\nend\n
Run Code Online (Sandbox Code Playgroud)\n

Aet*_*rus 6

如果some_object.some_method不是单例方法,那么您只需调用super重新定义的方法即可。

def some_object.some_method
  super
  do_something_else
end
Run Code Online (Sandbox Code Playgroud)

如果some_object.some_method是单例方法,那么

红宝石 >= 2.0.0

您可以在模块中定义该方法

module SomeModule
  def some_method
    super
    do_something_else
  end
end
Run Code Online (Sandbox Code Playgroud)

然后将其添加到对象的单例类之前

some_object.singleton_class.prepend(SomeModule)
Run Code Online (Sandbox Code Playgroud)

红宝石<2.0.0

您必须创建一个别名然后重新定义,因为没有Module#prepend.

class << some_object  # open the singleton class of some_object
  alias some_method_original some_method

  def some_method
    some_method_original
    do_something_else
  end
end
Run Code Online (Sandbox Code Playgroud)