もしかして絶望した
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
