Ruby Moudle

モジュールの使用例

  • 関数のようにモジュール内に定義されたメソッドを実行
  • クラスの中にインクルードする

制限

  • モジュールはクラスのようにオブジェクトを作成することはできない。

モジュールないのコードを利用する方法

  • module_functionを利用
  • railsなら ActiveSupport::Concernを利用

module_function - モジュールを関数のように実行するには

  • モジュール内のメソッドをモジュール関数として実行できるように設定する必要があります。
  • モジュール関数とは、プライベートメソッドであると同時に モジュールの特異メソッドでもあるようなメソッドです。
  • 例えば Math モジュールのメソッドはすべてモジュール関数です。
module ModuleName
  def hoge_method
    ...
  end
  module_function :hoge_method
end

# call
# モジュールはクラスのようにオブジェクトを作成出来ませんので、このようにモジュール名を指定してメソッドを実行します
ModuleName.hoge_method

moudle_functionから private methodへアクセス

https://stackoverflow.com/questions/18518575/accessing-private-methods-from-module-functions-in-ruby

module Party

  def enjoy
    puts 'hello'
  end

  def pooper
    enjoy
  end

  private_class_method :enjoy
  module_function :pooper
end

Party.pooper # => 'hello'
Party.enjoy # => private method `enjoy' called for Party:Module (NoMethodError)

ActiveSupport::Concern - rails

Rubyには元から mix-in という処理を切り出す機能があるが、ActiveSupport::Concernを利用するといくつか利点がある

  • mix-inの複雑な記述を省略できる
  • 複雑な依存関係を考えずにすむ
  • include 元のクラスメソッドの記述が簡単にできる
    • 通常のメソッドは特別ない記述無しで利用できる

利用classコード

class C
  include M
end

# foo はクラスメソッド
C.foo

# bar はインスタンスメソッド.
C.new.bar

before module

module M
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def foo
      puts 'foo'
    end
  end

  def bar
    puts 'bar'
  end
end

after moudle - use ActiveSupport::Concern

module M
  extend ActiveSupport::Concern

  module ClassMethods
    def foo
      puts 'foo'
    end
  end

  def bar
    puts 'bar'
  end
end

References

ActiveSupport::Concern

module_function

results matching ""

    No results matching ""