13F

備忘録

Rubyを勉強中 2

2007-11-12 21:57:29 | Weblog
なんとなく以下のようなものを書いてハマるの巻。
class Foo
  def method_missing(name, *args)
    # なぜかマッチしない
    if name =~ /Aadd_(.*)/ && args.length == 1
      auto_push($1, args[0])
    end
  end

  def auto_push(name, arg)
    v_name = "@#{name}"
    array = instance_variable_get(v_name)
    unless array
      array = []
      instance_variable_set(v_name, array)
    end
    array.push(arg)
  end
end

x = Foo.new
x.add_bar('bar!')
p x

4行目の単純な正規表現がマッチしないため auto_push が呼ばれず困惑。"puts name" とか挿入してみてもきちんと "add_bar" と出てくるため、なんでだよーと思ってしまった。

よくドキュメントを見ると method_missing の第一引数は Symbol で、そのままでは正規表現にマッチしないのだった……。
:add_bar =~ /bar/  # マッチしない
100 =~ /0/         # こういうのも同じ

はじめから相手にする気がないのにTypeErrorとかにしないのは何故だろう? できるだけ例外は吐かないようにするポリシーなのかな。

教訓としては、
  • ドキュメントをきちんと読め。
  • 「printfデバッグ」をやるときは puts ではなく p を使う?(p なら :add_bar のようにシンボルとして表示された)


追記:正規表現のマッチングは、Rubyでは以下のように書くのが正しくなったらしい。
/bar/ =~ :add_bar
/0/ =~ 100

これだと期待通り(?)TypeError になる。