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