たしかに型が恋しくなることもある

http://d.hatena.ne.jp/wasisan/20080224/p1

たしかにRuby使ってると稀に型が恋しくなることがある。

メソッドfooの名前をfoo-newに変更したとき,メソッドtest内では元の名前fooで参照している とする.この場合,fooは存在しないとしてエラーが出てほしいのだが,実際エラーは出ない. test()として呼び出したときに初めてfooがundefinedだとしてエラーが発生する.

test()
=> undefined method `foo'

ん、Rubyだと「test-foo」というメソッド名は受け付けないし、「test()」で呼び出すと「引数の数が違う」と言われますよ?

def foo_new (x) # foo -> foo_newに変更
  x+x
end

def test (x)
  foo(x)
end
test() rescue $! # => #<ArgumentError: wrong number of arguments (0 for 1)>
test(3) rescue $! # => #<NoMethodError: undefined method `foo' for main:Object>

こういった名前の参照チェッカはぜひともほしい気がする.

rcovを使えばある程度は可能。「rcov -a script_file」でcoverage/ディレクトリ以下にannotationされたRubyスクリプトが生成されるんで試してみて。「どこから呼ばれているか」、「何を呼んでいるか」が注釈される。

Rubyは型チェックに弱いのは仕方ない。そのかわりユニットテストをしっかり書けばある程度なんとかなるんじゃないかなー。テスト駆動開発だったらメソッド名を変更する前にテストのメソッド名を変更するし。