Edited at

【Ruby】モジュール関数を理解する

More than 1 year has passed since last update.


概要

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)