我的问题基于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
答案 0 :(得分:2)
如果some_object.some_method
不是单身方法,那么您只需在重新定义的方法中调用super
。
def some_object.some_method
super
do_something_else
end
如果some_object.some_method
是单身方法,那么
您可以在模块中定义该方法
module SomeModule
def some_method
super
do_something_else
end
end
然后将它添加到对象的单例类
some_object.singleton_class.prepend(SomeModule)
您必须创建别名然后重新定义,因为没有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