在另一个模块中扩展Ruby模块,包括模块方法

Jon*_*tin 32 ruby module

每当我尝试扩展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)


Jer*_*ten 9

我认为没有任何简单的方法可以做到这一点.

所以这是一个复杂的方式:

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)