なんとなく以下のようなものを書いてハマるの巻。
4行目の単純な正規表現がマッチしないため auto_push が呼ばれず困惑。"puts name" とか挿入してみてもきちんと "add_bar" と出てくるため、なんでだよーと思ってしまった。
よくドキュメントを見ると method_missing の第一引数は Symbol で、そのままでは正規表現にマッチしないのだった……。
はじめから相手にする気がないのにTypeErrorとかにしないのは何故だろう? できるだけ例外は吐かないようにするポリシーなのかな。
教訓としては、
追記:正規表現のマッチングは、Rubyでは以下のように書くのが正しくなったらしい。
これだと期待通り(?)TypeError になる。
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 になる。