Ruby/Rubyの基礎知識

Ruby2.0の新機能、Module#prependの紹介(3ページ目)

Module#prependが実現するMix-in方式をincludeと比較しながら紹介し、応用編としてRailsのalias_method_chain処理をprependに書き換えます

橋本 拓也

執筆者:橋本 拓也

Rubyガイド

aliasmethodchainをprependで書き換える

Module#prependメソッドの応用範囲はいろいろとありますが、一例としてRailsのaliasmethodchainと似た機能、prependで実装してみましょう。alias_method_chainはRails黒魔術のひとつで、ライブラリのメソッドをちょこっと書き換える時などに重宝していました。詳しくは Rails: aliasmethodchain: 既存の処理を修正する常套手段 TECHSCORE BLOG などを参照してください。

実のところ、もともとalias_method_chainModule#prependの仮想敵でもありました。

prependメソッドは、RailsコミッタでもあるYehuda Katzの提案で、 これがあればRailsのaliasmethodchainを撲滅できる、と息巻いていた。 私もそう思う。

Matzにっき(2010-11-13)

さて、それでは実例を見ていきます。最初のrequire群はalias_method_chainを定義しているActiveSupportをBundlerでロードしている部分なので読み飛ばしてください。

drinkは(ベース)_with_(機能)という名前にエイリアスが貼られ、機能追加版のメソッドが呼び出されます。また、もともとのロジックが(ベース)_without_(機能)という名前で退避させられているのがわかります。

これをprependで書くと、次のようになります。

追加機能をモジュールの形で書き、ベースとなるクラスをオープンしてprependするだけです。すっきりと書けるうえ、Coffeeモジュールは他のクラスに対してもprependして流用できそうです。

実例としてalias_method_chainを書き換えを紹介しましたが、Module#prependは他にもいろいろと活用できそうな機能です。何かカッコイイ例をご存じの方は教えて下さい。

以上で今回の記事は終わりです。

【編集部おすすめの購入サイト】
楽天市場で Ruby 関連の書籍を見るAmazon で Ruby 関連の書籍を見る
  • 前のページへ
  • 1
  • 2
  • 3
※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます