我有这样的模块结构:
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)
我有办法做到这一点吗?
答案 0 :(得分:4)
以下是将包含常量,实例方法和类方法的模块混合到一个类中的常用方法,但它也可以用于在另一个模块中包含一个模块的常量和类方法,这就是你想要的去做。它使用“回调”或“钩子”方法Module#included。 Object#extend在模块中添加实例方法,该模块是extend
接收器模块的参数。下面是模块Public::C_Meths
中Child
类方法中的实例方法(这里只是一个)。
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_Meths
和include Parent
:
class A
include Parent
end
然后
A::PARENT_CONST
#=> "parent const"
A.cmeth
#=> "cmeth"
A.new.imeth
#=> "imeth"