module_functionとは
- モジュールで定義されているメソッドを、モジュール関数として扱えるようにするためのメソッド。
- 引数にメソッド名が指定された場合はそのメソッドがモジュール関数になる。
- 指定されなければ
module_function
の定義以降に定義されたメソッドがモジュール関数になる。
指定しなければメソッドはprivateで定義される。
定義例
Ruby技術者認定試験合格教本 p298
module_function
で指定したメソッドを同クラス内で呼び出せるようにしている。
# 引数指定
module M
def bar
puts "OK"
end
def foo
puts "BAD"
end
module_function :bar # 引数にはシンボルでメソッド名を指定
end
M.bar # => OK
M.foo # => undefined method `foo' for MyMethods:Module (NoMethodError)
# 複数指定
module M
def bar
puts "OK"
end
def foo
puts "BAD"
end
def hoge
puts "HOGE"
end
module_function :bar, :foo # 複数指定する場合
end
M.bar # => OK
M.foo # => BAD
M.hoge # => undefined method `foo' for MyMethods:Module (NoMethodError)
# 引数を指定しない
module M
def bar
puts "OK"
end
module_function
def foo
puts "BAD"
end
end
M.foo # => BAD
M.bar # => undefined method `foo' for MyMethods:Module (NoMethodError)
クラス内で使用する
class TestClass
module M
def hoge
puts "Hello"
end
module_function :hoge
end
# Mクラスのインスタンスメソッド「call_hoge」内でモジュール関数「hoge」を呼び出し
def call_hoge
M.hoge
end
# Mのクラスメソッド「hogehoge」内でモジュール関数「hoge」を呼び出し
def M.hogehoge
M.hoge
end
end
a = M.new
puts a.call_hoge # => Hello
puts M.hogehoge # => Hello
クラス内でincludeして使う
module M
def hoge
puts "World"
end
module_function :hoge
end
class C
include M
def piyo
hoge
end
end
hoge = C.new
# module_functionでモジュール関数として指定しているのでトップレベルで呼べる
M.hoge # => World
# Cクラスのインスタンスメソッド内で呼んでおりますので呼べる
hoge.piyo # => World
# privateメソッドなのでオブジェクトからは呼べない
hoge.hoge # => private method `hoge' called for #<TestClass:0x0000564bdaed4e10> (NoMethodError)
今回はここまで。
リファレンス: Module#module_function