Ruby でモジュールをメソッド呼び出しで include する方法
Ruby
Published: 2019-05-18

やったこと

Ruby でモジュールを取り込むときに、ファイルの定義ではなくメソッド呼び出して取り込む方法を調べました。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

test.rb

module A
  def ggg
    'ggg'
  end
end

s = Struct.new(:x, :y)
p s.superclass
p s.superclass.superclass
p s.superclass.superclass.superclass

b = s.include(A)
p b.new.ggg

p '---'
class C
end
p C.superclass
p C.superclass.superclass

c = C.include(A)
p c.new.ggg

p c.new.extend(A).ggg

出力結果

$ ruby test.rb
Struct
Object
BasicObject
"ggg"
"---"
Object
BasicObject
"ggg"
"ggg"

include は、インスタンス化する前に使って、 extend は、インスタンス化した後に取り込むときに使うことができるようです。

参考