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

Calling original method from a redefined one

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

如何重新定义方法并从新方法中调用原始定义? some_object 的 class 的其他实例不应成为受影响。

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

如果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

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

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
class Klass
  def greeting
    puts "hiya"
  end

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

Bob 掌握了句柄并尝试了标准问候语。

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

他觉得这太没有人情味了,所以他决定在问候语之后加上 "I'm Bob"。他通过在他的单例 class 上定义一个方法 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