如何将类中的方法扩展到单个Ruby对象实例?
如何将类中的方法添加到单个Ruby对象中?
当然可以实现,核心思路是操作对象的单例类(eigenclass)——每个Ruby对象都有一个专属的匿名类,控制着这个对象独有的方法。我们只需要让这个单例类包含目标类,就能把类里的实例方法挂载到单个对象上,同时完全兼容类的子类化需求。
补全后的完整代码
# MyClass class MyClass def method_a return 'this is method a' end end # ExtraMethods class ExtraMethods def method_b return 'this is method b' end end # node obj = MyClass.new() puts obj.method_a # => this is method a # add methods to object # obj.extend ExtraMethods obj.singleton_class.include(ExtraMethods) # call added method puts obj.method_b # => this is method b
你也可以用另一种等价写法:
# 替换上面的添加方法代码 class << obj include ExtraMethods end
子类化场景的扩展用法
因为用的是类继承范式,你可以轻松创建ExtraMethods的子类,再把子类的方法加到对象上:
# 子类化ExtraMethods class ExtraSubclass < ExtraMethods def method_c return 'this is method c' end end # 将子类方法添加到同一个obj obj.singleton_class.include(ExtraSubclass) puts obj.method_c # => this is method c
原理说明
Ruby的方法查找顺序是:对象的单例类 → 单例类的祖先链 → 对象本身的类 → 类的祖先链。通过obj.singleton_class.include(ExtraMethods),我们把ExtraMethods的实例方法注入到了obj的专属方法查找链中,只会影响这一个对象,不会污染MyClass的其他实例,同时完美支持类的继承扩展。
内容的提问来源于stack exchange,提问作者tscheingeld
相关产品推荐
相关产品推荐

