【发布时间】:2020-05-02 19:24:36
【问题描述】:
假设我有一个声明模块方法的模块(不是实例方法):
module M
def self.foo
puts 'foo'
end
end
现在假设我想将M.foo 混合到另一个类C 中,这样C.foo 就被定义了。
最后,我想这样做不改变M.foo 的定义方式 并且不只是在C 中创建一个调用M.foo 的方法。 (即将foo重写为实例方法不算数。使用module_function也不算数。)
这在 Ruby 中是不可能的吗?
【问题讨论】:
-
没有。如果您的意图是在类
C中混合成为类方法的方法,则必须使模块中的方法成为实例方法并使用C.extend M(或C.singleton_class.include M)。 (见Object#extend)。要使用模块方法,您必须调用定义它的模块上的方法,模块Math 的方法就是一个例子。 -
@CarySwoveland 完美答案!谢谢。
-
作为学术练习,您可以将
M上的所有类方法复制到实例方法中,但最好只修改M以首先将定义作为实例方法并可能@ 987654337@如果需要(或使用module_method)
标签: ruby module metaprogramming mixins composition