14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-18

概要

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)

14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?