【问题标题】:Ruby module include, can't access included methods, only constantsRuby 模块包含,无法访问包含的方法,只能访问常量
【发布时间】:2015-05-25 04:37:04
【问题描述】:

我有一个这样的模块结构:

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)

我有办法做到这一点吗?

【问题讨论】:

标签: ruby methods module mixins


【解决方案1】:

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

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"

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 2023-04-06
    • 2012-01-06
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多