Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Ruby2.0新規要素 | Module#prepend

概要

Module#prepend

詳細

Module#prependはクラスの手前にモジュールを追加します。

モジュールの機能を追加するという点についてはincludeと似ています。
includeはクラスに対して機能を追加する。
prependはクラスの既存機能を変更する。
という使い分けが一般的なようです。

tbpgr_utils gemのKernel#aa_ancestorsメソッド
includeとprependの継承階層の違いを確認してみます。

サンプルコード(include)
# encoding: utf-8
require 'tbpgr_utils'

class Hoge
  def hoge
    "hoge"
  end
end

module Higeable
  def hoge
    "hige" + super
  end
end

class Hoge
  include Higeable
end

puts Hoge.new.hoge
出力(include)
hoge
-------------
|BasicObject|
-------------
     |
-------------
|  Kernel   |
-------------
     |
-------------
|  Object   |
-------------
     |
-------------
| Higeable  |
-------------
     |
-------------
|   Hoge    |
-------------
サンプルコード(prepend)
# encoding: utf-8
require 'tbpgr_utils'

class Hoge
  def hoge
    "hoge"
  end
end

module Higeable
  def hoge
    "hige" + super
  end
end

class Hoge
  prepend Higeable
end

puts Hoge.new.hoge
出力(prepend)
higehoge
-------------
|BasicObject|
-------------
     |
-------------
|  Kernel   |
-------------
     |
-------------
|  Object   |
-------------
     |
-------------
|   Hoge    |
-------------
     |
-------------
| Higeable  |
-------------