読者です 読者をやめる 読者になる 読者になる

メタプログラミングRuby その1 [学習メモ]

学習メモ プログラミング Ruby

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版


今日からこの本を読んでいこうと思う。
これは原書第2版の翻訳で、以前は別の出版社から出ていたが改版に合わせてオライリーに移ったようだ。
以前の版もチラッと眺めたことはあったが、バージョンが古かったのと(たしか 1.8 辺りだったように思う)、プリミティブな所も書ける Common Lisp などに比べて Ruby の上にさらに層を作ると言うことが酷く非効率に思えたということがあってあまり惹かれなかったというのが正直なところだ。
しかし本屋でぴかぴかの本書を立ち読みしているうちに名著の香りが漂ってきて思わず購入してしまった。

本の作りは他のオライリー本に比べて高級感のある表紙だ。
それほど分厚くもないのでやる気がそがれることもなさそうだ。

本書は新入社員の "あなた" がメンターであるボブと会社の Ruby プロジェクトを通してメタプログラミングを学んでいくという形式になっている。
早速始めていこう。
なお、ブログ中のコードは大きく改変していることもある。

2章 月曜日 : オブジェクトモデル

2.1 オープンクラス
オブジェクト指向言語である Ruby においては外部メソッドにオブジェクトを渡すよりも、クラスを拡張してオブジェクト自身にやらせた方がエレガントだ。

name = "Bob"

# 外部メソッド
def say_hello(name)
  puts "Hello, #{name}!"
end

say_hello(name)
# -> Hello, Bob!

# クラスの拡張
class String
  def say_hello
    puts "Hello, #{self}"
  end
end

name.say_hello
# -> Hello, Bob!

このあたりは Rails チュートリアルでも少し出てきたところだ。
しかしこのやり方には問題もある。

str = "Text"
str.upto
# -> TEXT

class String
  def upto
    "up to " + self
  end
end

str = "Text"
str.upto
# -> up to Text

オープンクラスで作ったメソッドは既存のメソッドを上書きしてしまう。
それが組み込みかどうかなども一切考慮しない。
何も考えずに使うと見つけにくいバグを引き起こしうる。
このようなコードをモンキーパッチと言う。