メソッド名を打ち間違えてメソッドを呼べないことがあって寂しかったので,呼ぼうとしたメソッドがないときは編集距離が近いメソッドを勝手に呼ぶのを作ってみた.
module AutoCall def method_missing(method, *args) __send__(find_nearest_method(method), *args) end private def find_nearest_method(method) methods.sort_by{ |my_method| levenshtein_distance(my_method, method) }.first end # http://d.hatena.ne.jp/kenkitii/20090204/ruby_levenshtein_distance def levenshtein_distance(str1, str2) col, row = str1.size + 1, str2.size + 1 d = row.times.inject([]){|a, i| a << [0] * col } col.times {|i| d[0][i] = i } row.times {|i| d[i][0] = i } str1.size.times do |i1| str2.size.times do |i2| cost = str1[i1] == str2[i2] ? 0 : 1 x, y = i1 + 1, i2 + 1 d[y][x] = [d[y][x-1]+1, d[y-1][x]+1, d[y-1][x-1]+cost].min end end d[str2.size][str1.size] end end list = [1,2,3,4] list.instance_eval{ extend AutoCall } puts list.lengtththhth # => 4 p list.revvvvvvvvvvvvvvverse # => [4, 3, 2, 1]
https://gist.github.com/1224532
間違ってlengtththhthとかrevvvvvvvvvvvvvvverseとか書いても,ちゃんとlengthとreverseになるので,眠いときや,酔っ払ったときでもコードを書けるようになる.
これだとしょうもない感じだけど,IDEがメソッド名直してくれるみたいな機能は便利に使っているひとがいて,そういう方向の使い方もできるようにしたいと考えている.
修正モードで実行したときに,呼べないメソッドがあると,「もしかしてlengthですか」とか聞いてきて,対話的にソースコードを直していける,のような機能なら便利そう.
コンパイルすればどのメソッドに修正できるか分かる言語ならIDEから直せるけど,Rubyでは実行しないと,どのメソッドがあるか分からないので,実行しながら直すしかないし,そのほうが精度もよくてよさそう.
追記
既にこういうのあるそうです.メソッド名の一部に日本語でドキュメント書けるとは思っていなかったので便利だと思いました.たしかに,もとから method missing使ってるクラスでは正しく動かないと思います.親クラスのmethod missingを呼んで,NoMethodErrorが出たときだけ編集距離で探索する,とかにすればよいかもしれません.@toby_netさんありがとうございます.
ひとでさんのも両方ともレーベンシュタイン距離つかってる。すごい。
レーベンシュタイン距離、名前からもう便利さが伝わってくる
ひとでさんのrubyのメソッド名修正するやつの特徴、何が何でも強引に既存のメソッドを呼ぼうとするし、かなり便利
list._____________________________________だるい___________________________________(:reverse) で __send__呼ばれてるっぽくてlist反転したの返ってくる
list.先頭の要素を消したいのでdropする(2) #autocall.rb