怎么在Ruby中创建一个模块从另一个模块继承?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

我正在为Rails编写一个小程序,其中包含我在模块内部的模块内部构建的一些方法ApplicationHelper。这是一个例子:

module Helper
    def time
        Time.now.year
    end
end

module ApplicationHelper
    # Inherit from Helper here...
end

我知道一点,ApplicationHelper < Helper并且include Helper可以在类的上下文中工作,但是你会用什么来实现模块到模块的继承?

提问于
用户回答回答于

事实上,可以在另一个模块内部定义一个模块,然后其包含在外部模块内。

so ross$ cat >> mods.rb
module ApplicationHelper
  module Helper
    def time
      Time.now.year
    end
  end
  include Helper
end

class Test
  include ApplicationHelper
  def run
    p time
  end
  self
end.new.run
so ross$ ruby mods.rb
2012
用户回答回答于

一个潜在的问题是,如果包含的模块附加了类方法,那么这些方法可能会附加到错误的对象上。

在某些情况下,将“父”模块直接包含在基类中可能会更安全,然后使用新方法包含另一个模块。例如

module ApplicationHelper
  def self.included(base)
    base.class_eval do
      include Helper
      include InstanceMethods
    end
  end

  module InstanceMethods
    def new_method
      #..
    end
  end

end

新方法没有直接定义,ApplicationHelper因为include Helper在方法定义之后会运行,导致它们被覆盖Helper。或者可以定义class_eval块内的方法

扫码关注云+社区