本を読む

読書やコンピュータなどに関するメモ

もしかして絶望した

 LL魂というイベントにて、MatzさんがRubyの新機能として、「もしかして」機能というジョークを言っていた。ので、今朝、洗濯しながら試作してみた。

irb(main):001:0> require 'method_moshikashite'
=> true
irb(main):002:0> "abc".upcade
undefined method String#upcade
もしかして: upcase [Y/n] y
=> "ABC"

 作ってから、Matzさん本人がすでに日記でGuessMethodを紹介していることがわかった。というか元ネタだ。絶望した。

 まぁ、レーベンシュタイン距離ってネタを知ったからいいや。しかし、これをPHPは標準装備してるのかぁ。

追記(2007.8.6):ほとぼりが冷めたと思うのでこっそり公開。

#!/usr/bin/ruby -Ku
require 'text/levenshtein'
require 'readline'

module MethodMoshikashite
  def y_or_n_p(prompt, default_val = true)
    s = Readline.readline(prompt)
    (s == 'y' || s == 'Y') ?  true :
    (s == 'n' || s == 'N') ?  false :
    default_val
  end

  def method_moshikashite(word, candidates)
    candidates.sort_by {|x| Text::Levenshtein::distance(x, word)}.each do |s|
      if y_or_n_p("もしかして: #{s} [Y/n] ")
        return :"#{s}"
      end
    end
    nil
  end
end

class Object
  include MethodMoshikashite

  def method_missing_moshikashite(m, *args, &block)
    STDERR.puts "undefined method #{self.class}##{m}"
    if m2 = method_moshikashite(m.to_s, self.methods)
      self.send(m2, *args, &block)
    else
      raise NoMethodError.new(
        "undefined method `#{m}' for #{inspect}:#{self.class}")
    end
  end

  alias_method :method_missing_orig, :method_missing
  alias_method :method_missing, :method_missing_moshikashite
end

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/267-679939c6

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad