ruby - 在另一个模块内扩展模块

cod*_*aig 19 ruby

我正在尝试定义几个模块,以便轻松地将一些实例和类方法添加到其他类中,这就是我正在做的事情:

module Foo
  module Bar
    def speak
      puts "hey there"
    end
  end
  module Baz
    extend Foo::Bar

    def welcome
      puts "welcome, this is an instance method"
    end
  end
end

class Talker
  include Foo::Baz
end

Talker.new.welcome
Talker.speak
Run Code Online (Sandbox Code Playgroud)

这个输出是:

welcome, this is an instance method
undefined method 'speak' for Talker.class (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

我期待Talker拥有'speak'方法,因为它包括Foo :: Baz,它本身扩展了Foo :: Bar.

我错过了什么?

Via*_*kov 21

你可以试试这个:

module Baz
  extend Foo::Bar

  def self.included(base)
    base.send :extend, Foo::Bar
  end

  def welcome
    puts "welcome, this is an instance method"
  end
end
Run Code Online (Sandbox Code Playgroud)

这将自动扩展包含Baz的所有类.

PS:

extend Foo::Barmodule Baz原始片段中,此代码不会影响方法def self.included(base).