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\ 类的其他实例不应受到影响。
def some_object.some_method\n # call original `some_object.some_method` here\n do_something_else\nend\nRun Code Online (Sandbox Code Playgroud)\n
如果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是单例方法,那么
您可以在模块中定义该方法
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)
您必须创建一个别名然后重新定义,因为没有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)
| 归档时间: |
|
| 查看次数: |
2097 次 |
| 最近记录: |