moduleのメソッドをクラスメソッドとして追加したい
moduleのメソッドを、クラスのクラスメソッドとして追加したい場合、Object#extendが利用できます。
- extendは「引数で指定したモジュールのインスタンスメソッドを self の特異メソッドとして追加します」。
- includeの場合、クラスのインスタンスメソッドとして追加されます。
- ちなみに、extend,includeともにモジュールの特異メソッドは追加対象になりません。
# モジュール module Foo def foo puts "foo" end def self.var puts "var" end end # Fooをextend class ExtendFoo extend Foo end #ExtendFoo.extend Foo # これでも良い。 # Fooをinclude class IncludeFoo include Foo end # fooのメソッドが、ExtendFooのクラスメソッドとして追加される。 ExtendFoo.foo # インスタンスメソッドにはならない #extendFoo = ExtendFoo.new #extendFoo.foo # NoMethodError # includeではクラスメソッドとしては追加されない。 #IncludeFoo.foo # NoMethodError includeFoo = IncludeFoo.new includeFoo.foo # モジュールのクラスメソッドはメソッドincludeまたはextendの対象にならない。 # varはどちらにも追加されない。 #ExtendFoo.var # NoMethodError #includeFoo.var # NoMethodError
実行結果です。
foo foo