将类方法添加到ruby中的现有模块

时间:2013-01-31 16:54:55

标签: ruby module

我有一个模块,可以在包含到类中时添加类方法。

我想强制这个模块通过编写第一个将包含的另一个模块来扩展新方法。

以下代码给出了我想要做的不起作用的示例: 如果能够覆盖第一个模块的“self.included”函数以使用我的方法扩展基数,那将是很棒的。

到目前为止,我能够覆盖第一个模块的self.included函数,但调用super不起作用,所以我松开了第一个模块的类方法:

module SomeModule

  def self.included(base)
    base.send(:extend, ClassMethods)
  end

  module ClassMethods

    # Some methods

  end

end


module MyNewModule

 def self.included(base)
    base.class_eval do
      def self.included(base)
        base.send(:extend, ClassMethods)
        super(base)
      end
    end
  end

  module ClassMethods

    def my_method
    end

  end

end

SomeModule.send(:include, MyNewModule)

class Pouet

  include SomeModule

  my_method # undefined local variable or method `my_method' for Pouet:Class (NameError)

end

这可能吗?

2 个答案:

答案 0 :(得分:0)

在包含的块中使用instance_eval。

在instance_eval块中,您可以访问包含它的对象,因此您应该可以在那里包含额外的模块。

编辑:

您必须将字符串传递给instance_eval,因为该块将存储您当前的上下文。

我举例说明了https://github.com/JoePym/UndergroundFootball/blob/master/app/models/player.rb#L14

答案 1 :(得分:0)

最后设法让它自己工作。

请告诉我这是好事还是坏事:

module SomeModule

  def self.included(base)
    base.send(:extend, ClassMethods)
  end

  module ClassMethods

    def my_original_method
    end

    # Some methods

  end

end


module MyNewModule

  def self.included(base)
    base.class_eval do

      class << self

        alias_method :old_included, :included

        def included(base)
          old_included(base)
          base.send(:extend, ClassMethods)
        end

      end

    end
  end

  module ClassMethods

    def my_method
    end

  end

end

SomeModule.send(:include, MyNewModule)

class Pouet

  include SomeModule

  my_original_method
  my_method

end