概要
Rubyにおけるモジュール関数とは何かサンプルコードと共に簡単にまとめました。
モジュール関数とは?
モジュール関数の主な特徴は以下の2つです。
- モジュール内に
private
で定義されたインスタンスメソッドである。 - モジュールの特異メソッドである。
モジュール関数としてセットすることで、__「レシーバを全く取らない」か、「モジュールをレシーバとする」__場合にのみメソッドの実行が可能となります。
つまり、モジュール関数として定義されたメソッドはオブジェクトの状態に左右されず__関数的__に呼び出しを行うことができるようになります。
モジュール関数の定義方法
モジュールに定義したメソッドをモジュール関数化するには以下のように記述します。
# 定義方法1
module Module1 #モジュールを定義する。
def hello(name)
puts "Hello #{name}"
end
module_function :hello #メソッドをモジュール関数とする。
end
複数のメソッドを同時にモジュール関数化する場合には以下のように記載することも可能です。
module Module1 #モジュールを定義する。
module_function #これ以下に定義されたメソッドをモジュール関数とする。
def hello(name)
puts "Hello #{name}"
end
def good_morning(name)
puts "Good Morning #{name}"
end
end
モジュール関数の呼び出し方法
モジュール関数として定義されたメソッドを呼び出すには以下の2方法があります。
- モジュールから直接呼び出す。
- includeして使用する。
呼び出しの際には以下のように記述できます。
### モジュールの定義###
module Module1 #モジュールを定義する。
def hello(name)
puts "Hello #{name}"
end
module_function :hello #メソッドをモジュール関数とする。
end
### モジュール関数の呼び出し###
# モジュールから直接呼び出す。
Module1.hello('Ben') #=> Hello Ben
# includeする。
include Module1
hello("Doug")
通常のミックスインしたモジュールからの呼び出しを試みると以下のようにエラーが発生してしまいます。
class Obj
include Module1
end
obj = Obj.new.hello('Matt') #=> private method `hello' called for #<Obj:0x00007fde68127700> (NoMethodError)
モジュール関数の実例(Mathモジュール)
Rubyの組み込みモジュールであるMathモジュールでは全てのメソッドがモジュール関数として定義されています。
よって上記で実践したようなメソッドの呼び出しが可能です。
# モジュールから直接呼び出す。
p Math.sqrt(2) #=> 1.4142135623730951
# includeする。
include Math
p sqrt(2) #=> 1.4142135623730951
参考
Rubyリファレンス(module_function)
Rubyリファレンスマニュアル(module_function)