【发布时间】:2019-10-04 06:47:13
【问题描述】:
我有一个类可以像这样在其实例上动态定义方法
obj = Object.new
obj.define_singleton_method(:foo) { "foo" }
稍后,我想重新定义#foo,但能够调用原始实现。
当使用普通类时,这可以通过prepend MyModule 并在前置方法中调用super 来实现。但是#prepend 在实例级别上不可用。
我用#extend 尝试过,但它似乎根本没有覆盖#foo 方法:
obj = Object.new
obj.define_singleton_method(:foo) { "foo" }
mod = Module.new
mod.define_method(:foo) { "module foo" }
obj.extend(mod)
obj.foo
# => "foo"
我查看了 RSpec gem,因为它们实现了与 #and_wrap_original 类似的行为(请参阅 https://relishapp.com/rspec/rspec-mocks/v/3-8/docs/configuring-responses/wrapping-the-original-implementation)但我不在测试环境中,它看起来像很多设置代码来实现这种行为(跟踪存根,在重置它们时有回调等)。
那么知道如何在纯 Ruby 中做到这一点吗?
【问题讨论】:
标签: ruby