Ruby のモジュールについて
Ruby
Published: 2019-05-18

やったこと

Ruby のモジュールについて調べてみます。

確認環境

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

調査

モジュールの特徴

  • 名前空間を作る
  • モジュールのメソッドを、あるクラスのインスタンスメソッドとして取り込む
  • モジュールのメソッドを、あるオブジェクトの特異メソッド(クラスメソッド)として取り込む
  • モジュール関数を定義して使う

名前空間を作る

test.rb

module A
  class B_IN_A
  end
end

p A
p A::B_IN_A

出力結果

$ ruby test.rb
A
A::B_IN_A

モジュールのメソッドをクラスのインスタンスメソッドとして取り込む

Mix-in のことです。

test.rb

module C
  def hoge_in_c
    'hoge_in_c'
  end
end

class D
  include C
end

p D.new.hoge_in_c

出力結果

$ ruby test.rb
"hoge_in_c"

モジュールのメソッドをオブジェクトに取り込む

test.rb

module E
  def hoge_in_E
    'hoge_in_E'
  end
end

o = Object.new
o.extend E

p o.hoge_in_E

出力結果

$ ruby test.rb
"hoge_in_E"

モジュール関数

「privateなインスタンスメソッドであると同時に、モジュールの特異メソッドである」メソッドのこと

test.rb

module F
  module_function

  def hoge_in_F
    'hoge_in_F'
  end
end

include F
p hoge_in_F

p F.hoge_in_F

出力結果

$ ruby test.rb
"hoge_in_F"
"hoge_in_F"

include して呼び出せないことを確認します

test.rb

module F
  module_function

  def hoge_in_F
    'hoge_in_F'
  end
end

class TTT
  include F
end

p TTT.new.hoge_in_F

出力結果

$ ruby test.rb
Traceback (most recent call last):
ruby-module.rb:xx:in `<main>': private method `hoge_in_F' called for #<TTT:0x00007fbbb70ba458> (NoMethodError)

エラーメッセージから private メソッドとして定義されていることも分かりました。

参考

  • パーフェクトRuby