岩月と申します。

StringScannerオブジェクトをcase文で使うなら、
case文の式を省略してみてはいかがでしょうか。

require 'strscan'

s = StringScanner.new("foobarbaz")
while s.rest?
  case
  when s.scan(/foo/)
    puts("foo")
  when s.scan(/bar/)
    puts("bar")
  when s.scan(/baz/)
    puts("baz")
  end
end

あと、(4)のモジュールでメソッドを上書きする方法は
今でも使えますよ。superも使えます。

module M
  def foo
    puts("M#foo")
    super
  end
end

class C
  def foo
    puts("C#foo")
  end
end

c = C.new
c.extend(M)
c.foo

実行すると次のように表示されます。

M#foo
C#foo

-- 
IWATSUKI Hiroyuki <URL:mailto:don / na.rim.or.jp>