当两个模块都包含在Ruby的类中时,如何从另一个模块中调用在一个模块中定义的方法?

时间:2018-11-02 21:31:54

标签: ruby mixins

module A
  def before
    puts :before
  end
end

module B
  before
end

class Test
  include A
  include B
end

因此,目标是在解析模块B时调用before,而无需在模块B中使用extend A

Ruby 2.5.1

1 个答案:

答案 0 :(得分:0)

include模块时,它将采用该模块的实例方法并将其作为实例方法导入。但是,您在此处调用before方法的方式仅在它是 class 方法时才有效。

如果您希望B导入before作为类方法,则可以使用extend

module B
  extend A
  before
end

没有附加的extend,仅在实例方法范围内,并且仅当before调用B上的方法时,才可以从B调用Test

module A
  def before
    puts :before
  end
end

module B
  def call_before
    before
  end
end

class Test
  include A
  include B
  def do_thing
    call_before
  end
end

Test.new.do_thing # => before