6
2

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 3 years have passed since last update.

Ruby module_function

Last updated at Posted at 2019-05-09

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

6
2
1

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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?