- Ruby / Rails関連
READ MORE
Ruby20周年おめでとうございます。そして、待望の2.0.0がリリースされましたね!
1.8から1.9になったときと違い、互換性がなくなる変更は少ないので、比較的移行は楽そうです。
有名かつ大きな新機能は
ですが、ここではprependについて見てみます。
prependはメソッド探索チェーンの手前にmoduleを差し込む機能であって、何がうれしいかといえばalias_method_chainと同じことがシンプル・高速に実現できるということです。
たとえば以下のようなクラスがあったとします。
class Person
def hello
puts "Hello! I am a person."
end
end
class Student < Person
def hello
puts "Hello! I am a student."
end
end
ここで、挨拶の前後に処理を入れたい場合、Module#prependを使えばこのように簡単に実現できます。
module Polite
def hello
puts "これから挨拶します"
super
puts "よろしくお願いします"
end
end
class Student < Person
prepend Polite
end
Student.new.hello
実行結果
これから挨拶します
Hello, I am a student.
よろしくお願いいたします
同じことをRuby 1.9で実現したい場合、以下のようなアプローチが必要になります。
すぐに思いつく使い方としては、
などに使えそうですね。
このようなちょっとしたパッチを、少ないコード量で気軽に実現できるのが重要なポイントだと思います。
なお、メソッドの探索順を図で表すと、こんな感じです。
prependの場合、superでStudentクラスのメソッドが呼び出せることがわかると思います。
ここまで書いて、Personクラス意味ないことに気がついたorz