やったこと
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