每当我尝试扩展ruby模块时,我都会丢失模块方法.既不包含也不延伸都不会这样做.考虑一下片段:
module A
def self.say_hi
puts "hi"
end
end
module B
include A
end
B.say_hi #undefined_method
Run Code Online (Sandbox Code Playgroud)
无论B包括还是扩展A,都不会定义say_hi.
有没有办法完成这样的事情?
Phr*_*ogz 26
如果您是作者,module A并且经常需要这个,您可以像这样重新创作A:
module A
module ClassMethods
def say_hi
puts "hi"
end
end
extend ClassMethods
def self.included( other )
other.extend( ClassMethods )
end
end
module B
include A
end
A.say_hi #=> "hi"
B.say_hi #=> "hi"
Run Code Online (Sandbox Code Playgroud)
我认为没有任何简单的方法可以做到这一点.
所以这是一个复杂的方式:
module B
class << self
A.singleton_methods.each do |m|
define_method m, A.method(m).to_proc
end
end
end
Run Code Online (Sandbox Code Playgroud)
你可以把它放在这样的辅助方法中:
class Module
def include_module_methods(mod)
mod.singleton_methods.each do |m|
(class << self; self; end).send :define_method, m, mod.method(m).to_proc
end
end
end
module B
include_module_methods A
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24579 次 |
| 最近记录: |