Ruby模块包含,不能访问包含的方法,只能访问常量

时间:2015-03-21 23:01:40

标签: ruby methods module mixins

我有这样的模块结构:

module Parent

  PARENT_CONST = 'parent const'

  def Parent.meth
    puts 'parent meth'
  end

end

module Child
  include Parent
end

这可以按预期工作:

puts Parent::PARENT_CONST
 => parent const
Parent.meth
 => parent meth

我可以从子节点访问父节点的常量,但不能访问方法。像这样:

Child::PARENT_CONST
 => parent const
Child.meth
 => in `<main>': undefined method `meth' for Child:Module (NoMethodError)

我有办法做到这一点吗?

1 个答案:

答案 0 :(得分:4)

以下是将包含常量,实例方法和类方法的模块混合到一个类中的常用方法,但它也可以用于在另一个模块中包含一个模块的常量和类方法,这就是你想要的去做。它使用“回调”或“钩子”方法Module#includedObject#extend在模块中添加实例方法,该模块是extend接收器模块的参数。下面是模块Public::C_MethsChild类方法中的实例方法(这里只是一个)。

module Parent
  module I_Meths
    PARENT_CONST = 'parent const'
  end

  module C_Meths
    def cmeth
      'cmeth'
    end
  end

  def self.included(mod)
    mod.include(I_Meths)
    mod.extend(C_Meths)
  end
end

module Child
  include Parent
end

Child::PARENT_CONST
  #=> "parent const" 
Child.cmeth
  #=> "cmeth" 

使用此构造将包含约束,实例方法和类方法的模块混合到类中更为常见。

假设我们要添加实例方法:

def imeth
  'imeth'
end

到班级中的模块Parent::I_Methsinclude Parent

class A
  include Parent
end

然后

A::PARENT_CONST
  #=> "parent const" 
A.cmeth
  #=> "cmeth" 
A.new.imeth
  #=> "imeth"