たけ(tk)です

(1)StringScanner で case が使える方がうれしいのではないでしょうか?

s = StringScanner.new('This is an example string.')

until s.eos?
  case s
  when /\w+/ ; p [:word, s.matched]
  when /\s+/ ; p [:space, s.matched]
  else       ; p [:mismatched, s.string[s.pos..-1]] ; break
  end
end

#=> [:word, "This"]
#=> [:space, " "]
#=> [:word, "is"]
#=> [:space, " "]
#=> [:word, "an"]
#=> [:space, " "]
#=> [:word, "example"]
#=> [:space, " "]
#=> [:word, "string"]
#=> [:mismatched, "."]

(2)alias で実現できるのですが・・

require "strscan"

class Regexp
  alias eqq ===
  def ===(v)
    return eqq(v) unless v.is_a? StringScanner
    return v.scan(self)
  end
end

s = StringScanner.new('This is an example string.')

until s.eos?
  case s
  when /\w+/ ; p [:word, s.matched]
  when /\s+/ ; p [:space, s.matched]
  else       ; p [:mismatched, s.string[s.pos..-1]] ; break
  end
end

(3)alias方式はエレガントではない。

alias方式だと次のような問題があります。

1 なんとなくエレガントではない。
2 保存名の衝突を心配しなければならないのではないか?
3 loadで2回読み込んだとき、や組込みRubyで再実行したときに、無限ループ
になる。

(4)基本クラスのメソッドを変更するためのうまい方法は無いでしょうか?

たとえば、組込みモジュールで、基本クラスのメソッドと同じ名前で定義したと
きに、superで基本クラスの同名メソッドの呼び出しができるようにする、とか
・・

class StringScanner
module Regexp_ex
  def ===(v)
    return super unless v.is_a? StringScanner
    return v.scan(self)
  end
end
end

class Regexp
  include StringScanner::Regexp_ex
end

(5)super=承継元クラスの同名メソッドを呼び出す=とは別に、
overridden=上書きされたメソッドを呼び出す=というのを作るというのはどう
でしょう?

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武