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

时间:2016-07-29 23:20:52

标签: ruby monkeypatching

我的问题基于answer to the topic “redefining a single ruby method on a single instance with a lambda”

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

def some_object.some_method
  # call original `some_object.some_method` here
  do_something_else
end

2 个答案:

答案 0 :(得分:2)

如果some_object.some_method不是单身方法,那么您只需在重新定义的方法中调用super

def some_object.some_method
  super
  do_something_else
end

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

Ruby> = 2.0.0

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

module SomeModule
  def some_method
    super
    do_something_else
  end
end

然后将它添加到对象的单例类

some_object.singleton_class.prepend(SomeModule)

Ruby< 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

答案 1 :(得分:1)

class Klass
  def greeting
    puts "hiya"
  end

  def add_personal_greeting(str)
    define_singleton_method(:greeting) do
      super
      puts str
    end  
  end
end

鲍勃得到一个句柄并尝试标准问候语。

bob = Klass.new
  #=> #<Klass:0x007fa66b084ad0> 
bob.greeting
  # hiya

他觉得这太没人情味了所以他决定在问候后添加“我是鲍勃”。他通过在他的单例类中定义一个方法greeting来调用Klass的实例方法greeting,然后在问候语中添加另一行。

bob.add_personal_greeting("I'm Bob")

他试了一下。

bob.greeting
  # hiya
  # I'm Bob

好多了。注意

bob.singleton_class.superclass
  #=> Klass

与此同时,露西尝试了标准问候语。

lucy = Klass.new
  #=> #<Klass:0x007fa66a9ed050> 
lucy.greeting
  # hiya

她并不狂热,但它会这样做。

鲍勃决定改变他的问候语。

bob.add_personal_greeting("I'm Robert")

并试一试。

bob.greeting
  # hiya
  # I'm Robert