Ruby 2.6.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Objectクラス > extend
extend(*modules) -> self
[permalink][rdoc]引数で指定したモジュールのインスタンスメソッドを self の特異メソッドとして追加します。
Module#include は、クラス(のインスタンス)に機能を追加しますが、extend は、ある特定のオブジェクトだけにモジュールの機能を追加したいときに使用します。
引数に複数のモジュールを指定した場合、最後の引数から逆順に extend を行います。
module Foo
def a
'ok Foo'
end
end
module Bar
def b
'ok Bar'
end
end
obj = Object.new
obj.extend Foo, Bar
p obj.a #=> "ok Foo"
p obj.b #=> "ok Bar"
class Klass
include Foo
extend Bar
end
p Klass.new.a #=> "ok Foo"
p Klass.b #=> "ok Bar"
extend の機能は、「特異クラスに対する Module#include」と言い替えることもできます。ただしその場合、フック用のメソッドが Module#extended ではなく Module#included になるという違いがあります。
# obj.extend Foo, Bar とほぼ同じ
class << obj
include Foo, Bar
end
[SEE_ALSO] Module#extend_object,Module#include,Module#extended