从重新定义的方法调用原始方法
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
我的问题基于 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