Rubyリファレンス: Home

module_function (Module)

Edit   History

標準クラス・モジュール > Module > module_function

private

module_function([name, ...])

module_functionメソッドは、インスタンスメソッドと同名で同じ内容の特異メソッドをモジュールに定義します。引数にはメソッド名をシンボルか文字列で渡します。戻り値はモジュール自身です。

このメソッドを呼び出せるのはModuleオブジェクトだけで、Classでは呼び出せません。

module_functionメソッドを使うと、Mathモジュールのように同じメソッドをインスタンスメソッドとしても特異メソッドとしても持っているモジュールが作れます。そうしたインスタンスメソッドと特異メソッドの組合せをモジュール関数と呼びます。

次の例では、Areaモジュールのメソッドtrianglecircleをモジュール関数にしています。

module Area
  def triangle(base, height)
    base * height / 2.0
  end
  def circle(radius)
    radius * radius * 3.14
  end
  
  module_function :triangle, :circle
end
 
puts Area.triangle(7, 5)
puts Area.circle(3)
17.5
28.26

module_functionを使うと、インスタンスメソッドは自動的にprivateなメソッドになります。

class Calc
  include Area
end
 
c = Calc.new
p c.triangle(7, 5) rescue p $!
#<NoMethodError: private method `triangle' called for #<Calc:0x328000>>

引数なしでmodule_functionメソッドを呼び出すと、それ以降はインスタンスメソッドが定義されるたびに、同名で同じ内容の特異メソッドが自動的に定義されます。インスタンスメソッドは自動的にprivateなメソッドになります。

module Area
  module_function
  
  def triangle(base, height)
    base * height / 2.0
  end
  def circle(radius)
    radius * radius * 3.14
  end
end
 
puts Area.triangle(7, 5)
puts Area.circle(3)
17.5
28.26