ruby - Ruby prepend 不适用于类方法
问题描述
我正在尝试在 ruby 中使用 prepend 方法来覆盖类的方法,这是我的代码的工作方式:
module PrependedModule
def self.klass_method
puts 'PrependedModule klass_method'
end
def instance_method_a
puts 'PrepenedModule instance method'
end
end
class SomeClass
prepend PrependedModule
def self.klass_method
puts 'SomeClass klass_method'
end
def instance_method_a
puts 'SomeClass instance_method'
end
end
SomeClass.klass_method
SomeClass.new.instance_method_a
#output:
#SomeClass klass_method
#PrependedModule instance method
#expected:
#PrependedModule klass_method
#PrependedModule instance method
该脚本的输出如上所示,我们可以看到,实例方法instance_method_a
被 module 覆盖PrependedModule
,但没有被 class 方法覆盖klass_method
,当我调用klass_method
时SomeClass
,它仍然执行它的 origin 方法,而不是在PrependedModule
.
我对此感到困惑,不知道使用前置时类方法发生了什么。如果有人能为我解决这个问题,那将是一个很大的帮助。
解决方案
单例类不是这样工作的。您需要明确prepend
的特征类的方法SomeClass
:
module PrependedModule
module ClassMethods
def klass_method
puts 'PrependedModule klass_method'
end
end
def instance_method_a
puts 'PrepenedModule instance method'
end
end
class SomeClass
# prepending to the class
prepend PrependedModule
class << self
# prepending to the eigenclass
prepend PrependedModule::ClassMethods
end
def self.klass_method
puts 'SomeClass klass_method'
end
def instance_method_a
puts 'SomeClass instance_method'
end
end
推荐阅读
- java - Spring Test中的@Transactional注解
- javascript - React.js mdbottstrap 通过点击显示模态
- azure - 如何将 URL 映射到 uksouth.cloudapp.azure.com 网站
- javascript - 如何使弹出窗口仅在实际提交表单时调用javascript
- javascript - R reactable _如何截断单元格内容并在悬停时显示?
- nlp - 使用 Dialogflow 检测任意数量的意图
- javascript - CORS 策略已阻止从源“http://localhost:3000”访问“https://www.cloudflare.com/cdn-cgi/trace”获取
- ios - 如何以编程方式使用 myapp 文件夹打开默认文件应用程序?
- javascript - React 和 Express 在不同的 localhost 端口上运行,但 CORS 没有阻止 fetch 调用
- c++ - 从 C++ 派生类的 this 获取共享指针