理解自我,包括红宝石

use*_*830 1 ruby module

假设我有

module Mod
  def self.included(base)
      some_method
    end
  def some_method
  end
end

class A 
  include Mod
end
Run Code Online (Sandbox Code Playgroud)

我得到的some_method是没有定义.那么怎么可以some_method尽快打电话Mod

Aru*_*hit 8

您必须创建一个base类实例来调用它.

module Mod
  def self.included(base)
      base.new.some_method
  end
  def some_method
  end
end

class A 
  include Mod
end
Run Code Online (Sandbox Code Playgroud)

之后,包括模块Mod,some_method将作为类的实例的实例方法A.


spi*_*ann 6

included当模块包含在类中并some_method在类级别上调用时,在类级别调用该方法.因此some_method需要成为一种类方法.这将有效(注意self.some_method):

module Mod
  def self.included(base)
    some_method
  end
  def self.some_method
  end
end

class A 
  include Mod
end
Run Code Online (Sandbox Code Playgroud)

或者您需要首先创建基类的实例并调用some_method该实例,如答案中提到的@ArupRakshit.