hitode909の日記

趣味はマリンスポーツですの日記です

編集距離が近いメソッドを勝手に呼ぶ

メソッド名を打ち間違えてメソッドを呼べないことがあって寂しかったので,呼ぼうとしたメソッドがないときは編集距離が近いメソッドを勝手に呼ぶのを作ってみた.

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が出たときだけ編集距離で探索する,とかにすればよいかもしれません.@さんありがとうございます.