访问模块的类方法

时间:2014-08-12 07:37:45

标签: ruby module

我尝试将模块A包含/扩展到模块B中,模块B又包含在C类中。然后我想调用名为cm of A的类方法,但我不知道如何。

module A
  def self.included(klass)
    klass.extend ClassMethods
  end

  module ClassMethods
    def cm
      puts "cm"
    end
  end
end

module B
 include A
end

class C
 extend B
end

c = C.new
c.cm # -> does not work
C.cm # -> does not work

2 个答案:

答案 0 :(得分:1)

您可以使用扩充插件真正简化此语法:

https://github.com/henrik/augmentations

或基于它的宝石:

https://github.com/chemica/augmentations-gem

使用:

class User 
  augment MyModule
end

使用

等模块
module MyModule
  augmentation do


    def self.a_class_method
      # …
    end

    def an_instance_method
      # …
    end

  end
end

插件本身很小,只需几行代码。

答案 1 :(得分:0)

包含模块时,请执行以下操作:

module A
  def self.included(klass)
    klass.include ClassMethods
    puts :included
  end

  module ClassMethods
    def cm
      puts :cm
    end
  end
end

module B
 include A
end

class C
 include B
end

c = C.new
c.cm

同样在扩展类时,您可以这样做:

module X
  def self.extended(klass)
    klass.extend ClassMethods
  end

  module ClassMethods
    def cm
      puts :cm
    end
  end
end

module Y
  def self.extended(klass)
    klass.extend X
  end
end

class Z
 extend Y
end

Z.cm

请参阅 Include vs Extend in Ruby